DISTINCT 作用於 SELECT 列表,將結果集中所有列值完全相同的行合併為一行。本文解析單列/多列去重、與 GROUP BY 關係、性能影響、大數據替代方案。
SELECT DISTINCT column_name FROM table WHERE condition;
SELECT DISTINCT col1, col2, col3 FROM table;
| 查詢 | 去重維度 | 結果行特徵 |
|---|---|---|
DISTINCT city | city | city 唯一 |
DISTINCT city, state | (city, state) 元組 | city+state 組合唯一 |
DISTINCT * | 所有列 | 整行唯一 |
-- 僅返回唯一姓氏
SELECT DISTINCT OwnerLastName FROM AntiqueOwners;
-- 返回唯一 城市-州 組合
SELECT DISTINCT City, State FROM EmployeeAddressTable;
| 特性 | DISTINCT | GROUP BY |
|---|---|---|
| 語義 | 結果集去重 | 分組聚合 |
| 可用聚合函數 | 否 | 是 |
| 排序保證 | 無(實現常排序) | 無(需 ORDER BY) |
| 性能 | 臨時表/排序去重 | 可走索引掃描 |
| 擴展性 | 弱 | 強(HAVING、ROLLUP、窗口函數) |
💡 等價轉換:SELECT DISTINCT a,b FROM t ≡ SELECT a,b FROM t GROUP BY a,b
Using temporary,大結果集極慢INDEX (col1, col2) 可支援 DISTINCT col1, col2 索引全掃描去重WHERE 裁剪再 DISTINCTSELECT DISTINCT * 極其低效APPROX_COUNT_DISTINCT(col) (MySQL 8.0.11+),誤差 < 1%,毫秒級DISTINCT 只能出現一次,SELECT DISTINCT a, DISTINCT b 語法錯誤COUNT(DISTINCT col) 統計非空唯一值,COUNT(*) 統計行數ORDER BYDISTINCT,需轉換或哈希小結果集用 DISTINCT 簡潔;
需聚合指標用 GROUP BY;
大數據用近似算法或預聚合;
索引支撐去重列最關鍵。