首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 集合操作入門:UNION DISTINCT 與 UNION ALL 詳解

     編輯:MySQL 綜合教學

MySQL 集合操作入門:UNION DISTINCT 與 UNION ALL 詳解

集合操作屬於垂直合併,要求兩查詢列數、類型兼容。MySQL 支持 UNION DISTINCT(默認去重)與 UNION ALL(保留重複)。

測試數據準備

CREATE TABLE table1 (aid INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(20), tag VARCHAR(10)) ENGINE=InnoDB;
CREATE TABLE table2 (bid INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(20), tag VARCHAR(10)) ENGINE=InnoDB;

INSERT INTO table1 VALUES (1,'article1','MySQL'),(2,'article2','PHP'),(3,'article3','CPP');
INSERT INTO table2 VALUES (1,'article1','MySQL'),(2,'article2','CPP'),(3,'article3','C');

UNION DISTINCT(去重)

(SELECT * FROM table1) UNION (SELECT * FROM table2);

結果(重複行 1,article1,MySQL 僅保留一條):

+-----+----------+-------+
| aid | title    | tag   |
+-----+----------+-------+
| 1   | article1 | MySQL |
| 2   | article2 | PHP   |
| 3   | article3 | CPP   |
| 2   | article2 | CPP   |
| 3   | article3 | C     |
+-----+----------+-------+

實現機制:建臨時表 + 唯一索引 → 插入數據 → 返回結果。

UNION ALL(保留重複)

(SELECT * FROM table1) UNION ALL (SELECT * FROM table2);

結果包含重複行:

+-----+----------+-------+
| aid | title    | tag   |
+-----+----------+-------+
| 1   | article1 | MySQL |
| 2   | article2 | PHP   |
| 3   | article3 | CPP   |
| 1   | article1 | MySQL |  -- 重複
| 2   | article2 | CPP   |
| 3   | article3 | C     |
+-----+----------+-------+

效能與選型

  • UNION DISTINCT:需排序/哈希去重,消耗 CPU/內存/臨時表,大結果集慢。
  • UNION ALL:單純拼接,無去重開銷,**效能遠優於 UNION**。
  • 業務確定無重複或允許重複 → **優先 UNION ALL**。
  • 需去重且結果集大 → 考慮應用層去重或分批處理。

其他集合操作(MySQL 不直接支持)

  • INTERSECT(交集):可用 INNER JOIN 或 EXISTS 替代。
  • EXCEPT/MINUS(差集):可用 LEFT JOIN ... WHERE IS NULL 或 NOT EXISTS 替代。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved