集合操作屬於垂直合併,要求兩查詢列數、類型兼容。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');
(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 | +-----+----------+-------+
實現機制:建臨時表 + 唯一索引 → 插入數據 → 返回結果。
(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 | +-----+----------+-------+
INTERSECT(交集):可用 INNER JOIN 或 EXISTS 替代。EXCEPT/MINUS(差集):可用 LEFT JOIN ... WHERE IS NULL 或 NOT EXISTS 替代。