資料表 tbl 包含欄位 id、name,其中 name 有重複值。需求:查詢不重複的 name 列表、統計不重複筆數。
SELECT DISTINCT name FROM tbl;
結果:a, b, c(去除重複)。
SELECT name FROM tbl GROUP BY name;
效果等同 DISTINCT,但在某些複雜查詢中可搭配聚合函數使用。
SELECT COUNT(DISTINCT name) FROM tbl;
SELECT COUNT(*) AS total FROM (SELECT name FROM tbl GROUP BY name) AS t;
適用於需先按其他欄位分組再計數的場景。
SELECT DISTINCT col1, col2 FROM tbl;
-- 或
SELECT col1, col2 FROM tbl GROUP BY col1, col2;
DISTINCT 與 GROUP BY 皆會觸發排序/哈希去重,大表建議在去重欄位上建立索引。COUNT(DISTINCT ...) 通常比子查詢更高效(優化器可直接使用索引)。COUNT(DISTINCT col1, col2) 多欄位去重計數。去除重複值首選 DISTINCT,統計筆數用 COUNT(DISTINCT ...),複雜分組轉 GROUP BY。配合索引與 EXPLAIN 驗證執行計劃,確保大資料量下效能可控。