有時候資料庫就像一個記性很差的人——什麼都記下來,但常常忘了自己已經記過。結果你打開客戶城市的表格,裡面有十個「柏林」、五個「西雅圖」,還有一堆其他重複的。這很常見,因為不同客戶可能來自同一個城市。但你總不會想為了十個「柏林」去做十次廣告吧,明明就只有一個城市,對吧?
如果你只想拿到唯一的值——沒有重複的——那就有個超方便的指令 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:唯一組合加排序
現在我們把 DISTINCT 跟 ORDER 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 只會讓資料庫多做白工。
GO TO FULL VERSION