SELECT DISTINCT column1, column2, ... FROM table_name [WHERE condition];
作用:回傳不重複的資料列組合。`UNIQUE` 為同義字。
APPROX_COUNT_DISTINCT(col) 近似算法,效能提升 10-100 倍。ID FIRST_NAME LAST_NAME CITY DESCRIPTION -- ---------- --------- -------- ----------- 01 Jason Martin Toronto Programmer 02 Alison Mathews Vancouver Tester 03 James Smith Vancouver Tester 04 Celia Rice Vancouver Manager 05 Robert Black Vancouver Tester 06 Linda Green New York Tester 07 David Larry New York Manager 08 James Cat Vancouver Tester
SELECT DISTINCT City, Description FROM Employee; CITY DESCRIPTION --------- ----------- New York Manager Vancouver Tester Toronto Programmer Vancouver Manager New York Tester -- 5 種組合 (Vancouver Tester 出現 3 次只保留 1 筆)
SELECT coder,
COUNT(DISTINCT course) AS distinct_courses,
COUNT(*) AS total_rows
FROM offerings
GROUP BY coder;
CODER DISTINCT_COURSES TOTAL_ROWS
----- ---------------- ----------
1 2 3
4 2 2
8 2 2
11 1 1
13 2 2
-- 統計每位講師開授的「不同課程-學期」組合數
SELECT instructor_id,
COUNT(DISTINCT course_id || '#' || term) AS unique_offerings
FROM course_schedule
GROUP BY instructor_id;
| 誤區 | 問題 | 正確做法 |
|---|---|---|
| `SELECT DISTINCT a, b, c FROM t` 然後應用程式再處理 | 資料庫端排序大量資料,網路傳輸量大 | 在 SQL 直接完成聚合:`SELECT a, b, COUNT(*) FROM t GROUP BY a, b` |
| 大表 `SELECT DISTINCT *` | 全欄位比較極慢 | 僅選必要欄位,或建立覆蓋索引 |
| 用 `DISTINCT` 解決關聯查詢重複 | 治標不治本,掩蓋關聯邏輯錯誤 | 檢查 JOIN 條件、外鍵關係、是否需 `EXISTS` 半連接 |
SELECT APPROX_COUNT_DISTINCT(customer_id) FROM sales; -- 近似值,誤差通常 < 1%,執行時間從秒級降至毫秒級
適用場景:儀表板概覽、大數據探索、非精確會計統計。