
你在查詢資料庫時,常常會遇到重複的資料,這會讓結果看起來雜亂、不易分析。根據實際測試,資料庫備份時重複資料比例有時高達90%甚至95%,尤其是每日全備份的情境中,資料新增或異動量越低,重複資料比例越高。
這時你就可以利用 SQL 的 DISTINCT 功能,幫助你有效去除重複資料。
在商業應用上,sqldistinct查詢常見用途包括:

你在查詢資料時,常常會遇到重複的資料列。SQL 提供 DISTINCT 關鍵字,幫助你只選出獨特的資料。根據微軟官方文件,DISTINCT 會篩選查詢結果中的重複資料。當你查詢的資料表有重複值時,DISTINCT 只會保留每一組唯一的資料列。這個功能讓你在分析資料時,可以更快找到真正有用的資訊。
小提醒:選擇「獨特值」選項,其實就是在 SQL 指令中加入 DISTINCT 關鍵字。
你可以用 DISTINCT 來去除查詢結果中的重複值,讓結果只顯示唯一的資料。這個功能特別適合你想知道有哪些不同的城市、產品名稱或客戶時。DISTINCT 專注於查詢層面的去重,不會改變資料表本身的內容。如果你需要真正刪除資料表中的重複列,則要用其他方法,例如 GROUP BY 搭配 HAVING 或刪除指令。
你在進行 sqldistinct查詢 時,DISTINCT 通常會和 SELECT 語句一起使用。你也可以搭配 ORDER BY 來排序結果,或加上 WHERE 條件過濾資料。以下是常見的搭配方式:
你可以用這些方法靈活查詢資料,讓分析更有效率。
你在進行 sqldistinct查詢 時,最常用的語法就是 SELECT DISTINCT。這個語法可以幫助你從資料表中選出不重複的資料。你可以參考以下幾個重點:
基本語法格式如下:
SELECT DISTINCT 欄位1, 欄位2, ...
FROM 資料表名稱;
舉例來說,假設你有一個 customers 資料表,裡面有很多筆資料,City 欄位可能出現多次相同的縣市名稱。你可以這樣寫:
SELECT DISTINCT City FROM customers;
這樣你就能得到所有不重複的縣市名稱,讓資料更清楚。
你在查詢資料時,常常會遇到某個欄位有很多重複的值。這時候,sqldistinct查詢就能幫你把重複的資料去除,只留下不同的內容。例如,customers 資料表中的 City 欄位,可能有「台北市」出現多次。如果你用 SELECT City FROM customers;,查詢結果會顯示所有資料,包括重複的「台北市」。
當你改用 SELECT DISTINCT City FROM customers;,查詢結果只會顯示每個不同的縣市名稱一次。這樣你可以很快知道有哪些縣市出現在資料表中。這種查詢方式讓你在分析資料時更有效率,也能避免重複資料造成混淆。
你在做 sqldistinct查詢 時,單欄位去重是最常見的應用。你可以用這個方法找出所有不同的產品名稱、客戶電話或其他欄位的唯一值。這不僅讓資料更精簡,也方便你後續做統計或分析。
小提醒:如果你沒有使用 DISTINCT,查詢結果會包含所有重複的資料。使用 DISTINCT 後,每個不同的值只會出現一次,讓你更容易掌握資料的全貌。

你在資料分析時,常常需要同時檢查多個欄位的唯一組合。這時候,SQL 的多欄位 DISTINCT 語法就能幫你解決問題。當你在 SELECT DISTINCT 後面指定多個欄位時,只有當這些欄位的值全部相同,這一列才會被視為重複。這樣你可以找出所有獨特的資料組合。
不同資料庫系統有不同的多欄位 DISTINCT 實作方式。例如,在 PostgreSQL 中,你可以用 array_agg(DISTINCT ...) 聚合多個欄位,再用自訂函數去除重複值。這種方法語法簡潔,也能提升查詢效能。在 SQL Server 裡,你可以先用 UNPIVOT 把多欄位資料轉成直向,再用 DISTINCT 過濾重複,最後用 STRING_AGG 或 STUFF + FOR XML PATH('') 聚合成字串。這些技巧讓你能靈活處理多欄位的 sqldistinct查詢。
小提醒:只有當所有指定欄位的值都一樣時,SQL 才會把這些資料列視為重複,並只保留一筆。
你可以參考以下範例,了解多欄位 DISTINCT 的實際應用。假設你有兩個資料表:Person.Person 和 HumanResources.Employee。你想查詢每位員工的姓氏、名字和員工編號,並且只要唯一的組合。你可以這樣寫:
SELECT DISTINCT LastName, FirstName, BusinessEntityID
FROM Person.Person
JOIN HumanResources.Employee
ON Person.Person.BusinessEntityID = HumanResources.Employee.BusinessEntityID;
這個查詢會把所有重複的姓氏、名字和員工編號組合去除,只留下每個獨特的員工資料。如果你還想加上條件,例如只查詢獎金超過 1000 的員工,可以在 WHERE 子句加上條件。這種多欄位 sqldistinct查詢 也常用在廠商資料管理,像是同時查詢廠商名稱、聯絡人和電話,確保每個組合都不重複。
這些查詢方式能幫你快速整理出唯一的資料組合,讓資料分析更有效率。你可以根據實際需求,靈活選擇多欄位 DISTINCT 的用法。
你在資料分析時,常常需要計算不重複的資料數量。這時候,COUNT(DISTINCT 欄位) 就能幫你解決問題。這個語法會先去除重複值,再計算唯一且非NULL的資料筆數。你可以參考下列重點:
COUNT(DISTINCT 欄位) 只會計算唯一且非NULL的值。COUNT(DISTINCT CONCAT(欄位1, 欄位2))。COUNT(*) 會計算所有資料列,包括NULL,但不支援DISTINCT。你在GA4報表或ETL資料驗證時,常用COUNT DISTINCT來檢查資料唯一性。例如,計算唯一使用者數,避免同一用戶被重複計算。大型資料集時,也可以用
APPROX_COUNT_DISTINCT來提升效能,這個函數能快速估算唯一值數量,適合數百萬筆以上的資料。
你也可以把DISTINCT搭配其他聚合函數一起使用,像是SUM、AVG、MAX和MIN。這些函數能幫你計算唯一值的加總、平均、最大或最小值。下表整理了常見聚合函數與DISTINCT的搭配方式:
| 聚合函數 | DISTINCT 搭配說明 | 範例說明 |
|---|---|---|
| AVG | 支援 DISTINCT,計算唯一值的平均數 | SELECT AVG(DISTINCT ListPrice) FROM Product; |
| COUNT | 支援 COUNT(DISTINCT ...) 用法 | SELECT COUNT(DISTINCT client_id) FROM sales; |
| SUM | 支援 SUM(DISTINCT ...) | SELECT SUM(DISTINCT amount) FROM orders; |
| MAX、MIN | 可搭配 DISTINCT 篩選唯一值 | SELECT MAX(DISTINCT score) FROM exam; |
你在使用這些聚合函數時,系統會先移除重複項目,再進行計算。例如,AVG(DISTINCT col) 會先去除重複值再算平均。聚合函數也會自動忽略NULL值。如果你分析的資料全是NULL,結果會是NULL。你在多維分析時要注意,SUM屬於加法性聚合,DISTINCT COUNT則不是,這會影響彙總結果的正確性。
小提醒:DISTINCT能讓你的統計結果更精確,避免重複資料影響分析判斷。
你在使用DISTINCT時,必須注意它只能用在SELECT語句中。這個關鍵字專門用來過濾查詢結果中的重複資料。當你在SELECT子句中列出多個欄位時,只有所有欄位的值都相同,SQL才會把這一列視為重複並去除。你不能在INSERT、UPDATE或DELETE語句中使用DISTINCT。舉例來說,MySQL和Microsoft Access都明確規定,DISTINCT僅限於SELECT查詢。
你在查詢大量資料時,DISTINCT會增加資料庫的運算負擔。因為系統需要先比對所有資料,再去除重複值,這會讓查詢速度變慢。特別是一對多關係的查詢,DISTINCT可能讓效能大幅下降。你可以考慮用EXISTS子查詢來取代DISTINCT,這樣查詢會更有效率。例如:
-- 效能較差
SELECT DISTINCT DEPT_NO, DEPT_NAME FROM DEPT D, EMP E WHERE D.DEPT_NO = E.DEPT_NO
-- 效能較佳
SELECT DEPT_NO, DEPT_NAME FROM DEPT D WHERE EXISTS (SELECT 'X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO)
當你同時使用DISTINCT和ORDER BY時,必須確保ORDER BY的欄位已經出現在SELECT的選取清單中。ORDER BY會針對去重後的結果進行排序。如果你在複合查詢(如UNION)中使用ORDER BY,必須把ORDER BY放在整個語句的最後。這些規則可以避免排序欄位與查詢結果不一致,確保你得到正確的排序結果。
你在選擇DISTINCT或GROUP BY時,應該根據查詢需求來決定:
| 用法 | 適合情境 | 功能說明 |
|---|---|---|
| DISTINCT | 只需去除重複值 | 只保留唯一資料,不做彙總 |
| GROUP BY | 需要分組統計時 | 可分組並搭配SUM、AVG等聚合運算 |
DISTINCT適合你只想取得不重複的欄位值,例如查詢所有不同的職位名稱。GROUP BY則能幫你分組並計算每組的總和、平均等統計資料。當你需要彙總數值時,GROUP BY是唯一選擇。你只想快速去重時,DISTINCT會更簡單。
小提醒:GROUP BY能做分組彙總,DISTINCT只能單純去重,兩者不能互相取代。選擇正確的語法,才能讓查詢更有效率。
你已經學會SQL DISTINCT的核心重點:它能過濾重複資料,讓查詢結果更精確。你在分析資料時,DISTINCT能確保每筆資料唯一,常與COUNT結合計算不重複數量。建議你在能用DISTINCT時,避免GROUP BY,語法更簡單。你可以參考finereport的自學資源,或用MySQL Sample Database練習JOIN、子查詢等題型,加深理解。選擇DISTINCT或GROUP BY時,請根據查詢需求靈活應用。
你用 DISTINCT 只會去除重複資料。GROUP BY 則會分組並可搭配聚合函數做統計。
小提醒:GROUP BY 適合需要分組計算時使用。
你只能在 SELECT 查詢時用 DISTINCT。UPDATE 和 DELETE 不支援這個語法。
建議:如需刪除重複資料,請用其他方法。
你可以在 SELECT DISTINCT 後面列出多個欄位。只有所有欄位值都相同時,才會被視為重複。
SELECT DISTINCT 欄位1, 欄位2 FROM 資料表;
你查詢大量資料時,DISTINCT 會增加運算負擔。資料越多,查詢速度越慢。
建議:只在必要時使用 DISTINCT。
COUNT(DISTINCT 欄位) 只計算唯一且非NULL的值。COUNT(欄位) 則會計算所有非NULL的資料。
免費資源下載