許多開發者誤以為 UNION 僅合併結果,實則 MySQL、SQL Server、ANSI SQL:2003 均規定 UNION 默認等價於 UNION DISTINCT。本文通過實測、官方手冊、標準文檔三重證據,徹底釐清該行為。
-- 兩表各插入 userId=45 多條重複記錄
td_base_data : 3 條
td_base_data_20090527 : 4 條
| 查詢方式 | 結果 | 說明 |
|---|---|---|
| 單表 COUNT | 3 / 4 | 基準 |
| 標量相加 | 7 | 3+4,含重複 |
| UNION id | 4 | 去重後唯一 id 數 |
| UNION * | 4 | 全行去重 |
| UNION ALL | 7 | 保留所有重複 |
結論:UNION 確實默認去重。
ALL,所有返回行唯一,如同對整個結果集用了 DISTINCT;DISTINCT 關鍵字可選,不改變行為。」ALL 保留重複行;若未指定,刪除重複行。」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 應建索引,避免全表掃描。UNION 不去重,導致統計數字偏少。UNION 加 DISTINCT,增加解析器負擔(無害但多餘)。