SQL DISTINCT運算子


在本教學中,我們將學習如何使用SQL DISTINCT運算子從結果集中刪除重複資料項。

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_idsalary列的資料。

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_id5salary17000兩行記錄。

現在,如果將DISTINCT運算子新增到SELECT子句,則資料庫系統將使用job_idsalary列中的值來計算重複項。 它只保留一個行記錄,如上面的螢幕截圖所示。

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運算子從結果集中刪除重複的行。