在本教學中,我們將學習如何使用SQL DISTINCT
運算子從結果集中刪除重複資料項。
主鍵確保表沒有重複的行。 但是,當您使用SELECT
語句查詢表中的一部分列時,可能會得到重複資料項。
要從結果集中刪除重複資料項,請在SELECT
子句中插入DISTINCT
運算子,如下所示:
SELECT DISTINCT
column1, column2, ...
FROM
table1;
如果在DISTINCT
運算子後使用一列,則資料庫系統使用該列來計算重複。 如果使用兩列或更多列,資料庫系統將使用這些列的組合進行重複檢查。
要刪除重複項,資料庫系統首先按SELECT
子句中指定的每個列對結果集進行排序。 然後,它從上到下掃描表,以識別彼此相鄰的重複項。 如果結果集很大,則排序和掃描操作可能會降低查詢的效能。
我們將使用範例資料庫中的employees
表來演示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 |
... ...
現在,從結果集中刪除所有重複項。
以下語句從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 |
......
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
運算子從結果集中刪除重複的行。