在本教程中,我們將學習如何使用sqldistinct
運算子從結果集中刪除重複資料項。
1. sql distinct運算子簡介
主鍵確保表沒有重複的行。 但是,當您使用select
語句查詢表中的一部分列時,可能會得到重複資料項。
要從結果集中刪除重複資料項,請在select
子句中插入distinct
運算子,如下所示:
select distinct
column1, column2, ...
from
table1;
如果在distinct
運算子後使用一列,則資料庫系統使用該列來計算重複。 如果使用兩列或更多列,資料庫系統將使用這些列的組合進行重複檢查。
要刪除重複項,資料庫系統首先按select
子句中指定的每個列對結果集進行排序。 然後,它從上到下掃瞄表,以識別彼此相鄰的重複項。 如果結果集很大,則排序和掃瞄操作可能會降低查詢的效能。
2. sql distinct示例
我們將使用示例資料庫中的employees
表來演示distinct
運算子的工作原理。
3. sql distinct一列示例
以下語句從employees
表中檢索薪水資料,並按降序對其進行排序。
select
salary
from
employees
order by salary desc;
執行上面查詢語句,得到以下結果 -
+--------+
| salary |
+--------+
| 24000 |
| 17000 |
| 17000 |
| 14000 |
| 13500 |
| 13000 |
... ...
如上所見,有重複的薪資資料,例如17,000
,因為兩個或更多員工的薪水相同。 要刪除重複項,請將distinct
運算子新增到select
子句,如下所示:
select
distinct salary
from
employees
order by salary desc;
執行上面查詢語句,得到以下結果 -
+--------+
| salary |
+--------+
| 24000 |
| 17000 |
| 14000 |
| 13500 |
| 13000 |
| 12000 |
... ...
現在,從結果集中刪除所有重複項。
4. sql distinct多列示例
以下語句從employees
表中檢索job_id
和salary
列的資料。
select
job_id,
salary
from
employees
order by
job_id,
salary desc;
執行上面查詢語句,得到以下結果 -
+--------+--------+
| job_id | salary |
+--------+--------+
| 1 | 8300 |
| 2 | 12000 |
| 3 | 4400 |
| 4 | 24000 |
| 5 | 17000 |
| 5 | 17000 |
... ...
上面查詢結果集中,有兩行記錄相同:job_id
是5
和salary
是17000
兩行記錄。
現在,如果將distinct
運算子新增到select
子句,則資料庫系統將使用job_id
和salary
列中的值來計算重複項。 它只保留乙個行記錄,如上面的螢幕截圖所示。
select distinct
job_id,
salary
from
employees
order by
job_id,
salary desc;
執行上面查詢語句,得到以下結果 -
+--------+--------+
| job_id | salary |
+--------+--------+
| 1 | 8300 |
| 2 | 12000 |
| 3 | 4400 |
| 4 | 24000 |
| 5 | 17000 |
| 6 | 9000 |
| 6 | 8200 |
......
5. sql distinct和null值
null值在sql中是乙個特別的值。 它在某些情況下用作標記,比如:缺少資訊或資訊不適用。 因此,null
無法與任何值進行比較。 即使null
也不等於它自己。 如果列中有兩個或多個null
值,資料庫系統是否將它們視為相同或不同的值?
通常,distinct
運算子將所有null
值視為相同的值。 因此在結果集中,distinct
運算子只保留乙個null
值,並從結果集中刪除其它的null
值。
以下語句返回員工的不同**號碼。
select distinct
phone_number
from
employees;
執行上面查詢語句,得到以下結果 -
+----------------+
| phone_number |
+----------------+
| 0532-86011111 |
| 0551-4243311 |
| 0571-87622362 |
......
| null |
| 0351-2233611 |
| 021-66050000 |
| 010-67237328 |
| 0755-28114518 |
| 0755-83587526 |
| 0513-83512816 |
| 0898-31686222 |
| 022-26144822 |
+----------------+
34 rows in set
請注意,它只返回乙個null
值。
在本教程中,您學習了如何使用distinct
運算子從結果集中刪除重複的行。
sql distinct 多列問題
查詢單列,使用select distinct name from photos 是沒有問題的。但若想查詢多列,如select distinct name,nickname,department from photos 是將三列完全相同的內容過濾掉,但凡三列有一列不同,均會列出來。若將distinct...
SQL DISTINCT 用法(去重)
現在以下資料 查有出現的teacherid 1 select teacherid from studentview code 結果 有重複的id出現 確實查法 1 select teacherid from student 2 group by teacherid view code 1 selec...
SQL Distinct處理多列的問題
今天在做ssis的etl工作時,其中乙個left join元件的執行結果總是會多出一些記錄。分析了一下,該問題的原因是右表中作為關聯的那一列資料有重複。left join的執行策略可以理解為根據左表的每一條記錄的關聯欄位去對照右表的關聯字段,如果右表的關聯字段存在重複,就會生成重複的記錄。如果左表存...