首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL UNION 默認去重機制深度驗證:從源碼到標準的完整證明

     編輯:MySQL 資料庫相關知識

許多開發者誤以為 UNION 僅合併結果,實則 MySQL、SQL Server、ANSI SQL:2003 均規定 UNION 默認等價於 UNION DISTINCT。本文通過實測、官方手冊、標準文檔三重證據,徹底釐清該行為。

實測場景

-- 兩表各插入 userId=45 多條重複記錄
td_base_data           : 3 條
td_base_data_20090527  : 4 條

各查詢結果對比

查詢方式結果說明
單表 COUNT3 / 4基準
標量相加73+4,含重複
UNION id4去重後唯一 id 數
UNION *4全行去重
UNION ALL7保留所有重複

結論:UNION 確實默認去重。

官方文檔佐證

  • MySQL 手冊 13.2.7.2:「若不使用 ALL,所有返回行唯一,如同對整個結果集用了 DISTINCT;DISTINCT 關鍵字可選,不改變行為。」
  • SQL Server BOL:「ALL 保留重複行;若未指定,刪除重複行。」

ANSI SQL:2003 標準條文

7.13  Syntax Rules
6) If UNION, EXCEPT, or INTERSECT is specified
   and neither ALL nor DISTINCT is specified,
   then DISTINCT is implicit.

標準明確規定 DISTINCT 為隱式默認。

性能與最佳實踐

  • 去重需排序/哈希,大數據集開銷顯著;明確不需要去重時務必加 ALL。
  • 正確統計雙表 userId=45 總數:
    SELECT COUNT(userId) FROM (SELECT userId FROM t1 WHERE userId=45 UNION ALL SELECT userId FROM t2 WHERE userId=45) tx;
  • 兩表 userId 應建索引,避免全表掃描。

避坑清單

  1. 誤以為 UNION 不去重,導致統計數字偏少。
  2. 為「保險」在所有 UNION 加 DISTINCT,增加解析器負擔(無害但多餘)。
  3. 跨庫/跨引擎查詢時,字符集、Collation 不一致可能導致隱式轉換改變去重語義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved