CodeGym /課程 /SQL SELF /用 DISTINCT 抽取唯一值

用 DISTINCT 抽取唯一值

SQL SELF
等級 6 , 課堂 1
開放

有時候資料庫就像一個記性很差的人——什麼都記下來,但常常忘了自己已經記過。結果你打開客戶城市的表格,裡面有十個「柏林」、五個「西雅圖」,還有一堆其他重複的。這很常見,因為不同客戶可能來自同一個城市。但你總不會想為了十個「柏林」去做十次廣告吧,明明就只有一個城市,對吧?

如果你只想拿到唯一的值——沒有重複的——那就有個超方便的指令 DISTINCT。它就像魔法拖把:一揮就把重複的行掃掉,只留下真的不一樣的。

DISTINCT 讓你從查詢結果裡只拿到唯一的行。這在你想去掉重複資料時超有用,比如:

  • 訂單裡的唯一商品。
  • 唯一的客戶名字。
  • 唯一的資料組合,比如「城市 + 國家」。

DISTINCT 怎麼運作?

DISTINCT 的語法超簡單,跟 SQL 一樣直覺:

SELECT DISTINCT 欄位1, 欄位2, ...
FROM 資料表;

當你在查詢裡加上 DISTINCT,資料庫就會保證每一行都是唯一的。

DISTINCT 的使用範例

我們先從經典範例開始,來看看 DISTINCT 怎麼用。

範例 1:單一欄位的唯一值

假設我們有一個 students 資料表,裡面有學生的資料:

-- 資料表 students

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Toronto
3 Anna Song Seattle
4 Nat Cole Chicago
5 Maria Chi Seattle

我們想知道學生來自哪些城市。寫個查詢

SELECT city
FROM students;

然後拿到結果:

city
Seattle
Toronto
Seattle
Chicago
Seattle

這不是我們想要的 :(

要去掉重複就要用 DISTINCT

SELECT DISTINCT city
FROM students;

結果:

city
Seattle
Toronto
Chicago

沒用 DISTINCT 的話,「Seattle」會出現三次,但我們只想要一次。

範例 2:多個欄位的唯一值

現在假設我們想拿到「名字 + 姓氏」的唯一組合,因為學生裡可能有同姓或同名的。

還是用同一個 students 資料表:

-- 資料表 students

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Toronto
3 Anna Song Seattle
4 Nat Cole Chicago
5 Maria Chi Seattle

查詢:

SELECT DISTINCT first_name, last_name
FROM students;

結果:

first_name last_name
Maria Chi
Alex Lin
Anna Song
Nat Cole

所以 DISTINCT 就像個過濾器:它會看你指定的所有欄位,只有那些所有欄位值都一樣的行才會被當成重複。

範例 3:唯一組合加排序

現在我們把 DISTINCTORDER BY 排序一起用,讓唯一值按照姓氏字母順序排好。

還是同一個 students 資料表:

-- 資料表 students

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Toronto
3 Anna Song Seattle
4 Nat Cole Chicago
5 Maria Chi Seattle

查詢:

SELECT DISTINCT first_name, last_name
FROM students
ORDER BY last_name ASC;

結果:

first_name last_name
Maria Chi
Nat Cole
Alex Lin
Anna Song

重複的行被刪掉,姓氏也照字母順序排好了。

範例 4:用在聚合函數上

如果我們想把 DISTINCT 用在函數上,比如 COUNT 呢?

SELECT COUNT(DISTINCT city) AS unique_city_count
FROM students;

結果:

unique_city_count
3

這個查詢會回傳唯一城市的數量。是不是很方便?

DISTINCT 的使用細節

DISTINCT 時要記得,它是根據你查詢裡所有指定的欄位來判斷唯一。如果你多加了欄位,結果可能就不一樣了。

範例 5:為什麼要懂上下文?

如果你在查詢裡多加一些欄位,這會影響行的唯一性。

SELECT DISTINCT first_name, city
FROM students;

資料表 students

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Austin
3 Anna Song Seattle
4 Otto Art Denver
5 Maria Chi Portland

結果:

first_name city
Maria Seattle
Alex Austin
Anna Seattle
Otto Denver
Maria Portland

現在每個「名字 + 城市」的組合都是唯一的。所以記住:唯一性是根據你查詢裡所有指定的欄位,不是每個欄位單獨算。

DISTINCT 常見的錯誤

DISTINCT 最常見的錯誤,就是搞錯查詢到底在做什麼。比如你查詢裡欄位太多,結果就會跟你想的不一樣,因為唯一性是根據所有欄位一起判斷的。

舉個例子:

SELECT DISTINCT *
FROM students;

這樣每一行都會被當成唯一,因為所有欄位都算進去了。

還有一個錯誤——在不需要的地方用 DISTINCT。如果你很確定資料已經是唯一的(比如主鍵欄位),那 DISTINCT 只會讓資料庫多做白工。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION