Navicat 部落格

從關聯式資料庫中選取相異值 2023 年 4 月 14 日,由 Robert Gravelle 撰寫

資料表欄(例如儲存名字的欄)可能有許多重複值。如果你想列出不同的(相異)值,就需要一個無需編寫復雜的 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)

如紅色框所示,名單中有重複的城市。

若要得到一個沒有重複的城市名單,我們可以將 DISTINCT 關鍵字加到 SELECT 陳述式中:

city_query_distinct (49K)

我們可以利用 Navicat 的自動完成程式碼功能來彈出 DISTINCT 關鍵字。當你在編輯器中輸入 SQL 陳述式時,Navicat 會在下拉式清單中顯示資訊,它能協助你完成編寫陳述式並顯示資料庫物件的可用內容(例如資料庫、資料表、欄位、檢視等)及其相應的圖示:

autocomplete (30K)

多個欄的範例

DISTINCT 關鍵字也可以套用於多個欄。在這種情況下,查詢將只傳回所有已選取的欄都是唯一的列。首先,讓我們將 country 欄位加到我們的最後一個查詢中:

city_country_query (70K)

我們又一次看到了重複項目,因為重複的城市很可能位於同一個國家或地區。

再一次,加入 DISTINCT 關鍵字會導致查詢引擎查看 city 和 country 欄的值組合以評估和移除重複項目:

city_country_query_distinct (68K)

DISTINCT 與 Null 值

如上所述,DISTINCT 子句將所有 NULL 值視為相同的值,而結果集只會有一個 NULL。我們可以在之前查詢的同一個 customers 資料表中查詢這些欄來親自測試這一點:

region_column (102K)

正如預測的那樣,加入 DISTINCT 關鍵字移除了所有 NULL,只剩一個:

region_query_distinct (42K)

關於從關聯式資料庫中選取相異值的結語

在這篇文章中,我們學習了如何使用 SQL DISTINCT 子句,它從 SELECT 陳述式的結果集中刪除重複項目,只留下唯一值。正如我們所見,它可以處理一個或多個欄以及 NULL 值。但是,如果你需要在一個或多個欄套用彙總函式,就應該改用 GROUP BY 子句。

Navicat 文章
頻道記錄
分享
部落格封存檔