資料表欄(例如儲存名字的欄)可能有許多重複值。如果你想列出不同的(相異)值,就需要一個無需編寫復雜的 SQL 陳述式就能做到的方法。在 ANSI SQL 相容的資料庫(例如 PostgreSQL、SQL Server 和 MySQL)中,從欄中僅選取相異值的方法是使用 SQL DISTINCT 子句。它會從 SELECT 陳述式的結果集中刪除重複項目,只留下唯一值。在本篇文章中,我們將學習如何使用它。
語法和行為
若要使用 SQL DISTINCT 子句,你需要在 SELECT 和欄和/或運算式清單之間加入 DISTINCT 關鍵字,如下所示:
SELECT DISTINCT columns/expressions FROM tables [WHERE conditions];
你可以在陳述式中包含一個或多個欄和/或運算式,因為查詢會用 SELECT 清單中所有指定欄的值組合來評估它們的唯一性。此外,如果將 DISTINCT 子句套用於具有 NULL 值的欄,DISTINCT 子句就會只保留一個 NULL 並消除其他 NULL。換句話說,DISTINCT 子句將所有 NULL 值視為相同的值。
單一個欄的範例
查詢的一個常見用途是列出公司客戶或使用者的所有城市和/或國家/地區。以下是在 Navicat Premium 16 中針對 classicmodels 範例資料庫編寫的查詢:
![city_query (107K)](https://www.navicat.com/link/Blog/Image/2023/20230414/CHT/city_query.jpg)
如紅色框所示,名單中有重複的城市。
若要得到一個沒有重複的城市名單,我們可以將 DISTINCT 關鍵字加到 SELECT 陳述式中:
![city_query_distinct (49K)](https://www.navicat.com/link/Blog/Image/2023/20230414/CHT/city_query_distinct.jpg)
我們可以利用 Navicat 的自動完成程式碼功能來彈出 DISTINCT 關鍵字。當你在編輯器中輸入 SQL 陳述式時,Navicat 會在下拉式清單中顯示資訊,它能協助你完成編寫陳述式並顯示資料庫物件的可用內容(例如資料庫、資料表、欄位、檢視等)及其相應的圖示:
![autocomplete (30K)](https://www.navicat.com/link/Blog/Image/2023/20230414/CHT/autocomplete.jpg)
多個欄的範例
DISTINCT 關鍵字也可以套用於多個欄。在這種情況下,查詢將只傳回所有已選取的欄都是唯一的列。首先,讓我們將 country 欄位加到我們的最後一個查詢中:
![city_country_query (70K)](https://www.navicat.com/link/Blog/Image/2023/20230414/CHT/city_country_query.jpg)
我們又一次看到了重複項目,因為重複的城市很可能位於同一個國家或地區。
再一次,加入 DISTINCT 關鍵字會導致查詢引擎查看 city 和 country 欄的值組合以評估和移除重複項目:
![city_country_query_distinct (68K)](https://www.navicat.com/link/Blog/Image/2023/20230414/CHT/city_country_query_distinct.jpg)
DISTINCT 與 Null 值
如上所述,DISTINCT 子句將所有 NULL 值視為相同的值,而結果集只會有一個 NULL。我們可以在之前查詢的同一個 customers 資料表中查詢這些欄來親自測試這一點:
![region_column (102K)](https://www.navicat.com/link/Blog/Image/2023/20230414/CHT/region_column.jpg)
正如預測的那樣,加入 DISTINCT 關鍵字移除了所有 NULL,只剩一個:
![region_query_distinct (42K)](https://www.navicat.com/link/Blog/Image/2023/20230414/CHT/region_query_distinct.jpg)
關於從關聯式資料庫中選取相異值的結語
在這篇文章中,我們學習了如何使用 SQL DISTINCT 子句,它從 SELECT 陳述式的結果集中刪除重複項目,只留下唯一值。正如我們所見,它可以處理一個或多個欄以及 NULL 值。但是,如果你需要在一個或多個欄套用彙總函式,就應該改用 GROUP BY 子句。