sql-unions-clause
SQL - 集合操作符 (UNION, INTERSECT, EXCEPT)
Section titled “SQL - 集合操作符 (UNION, INTERSECT, EXCEPT)”SQL 集合操作符用于合并两个或多个 SELECT 语句的结果集。与 JOINs(水平合并不同表的列)不同,集合操作符垂直合并行。它们用于合并、比较或减去结果集。
要使用集合操作符,SELECT 语句必须满足:
- 列的数量相同。
- 列的数据类型兼容且顺序相同。
让我们考虑两个表:WebsiteA_Users 和 WebsiteB_Users。
WebsiteA_Users:
+--------------------+| Email |+--------------------+| alice@example.com || bob@example.com || charlie@example.com|+--------------------+WebsiteB_Users:
+--------------------+| Email |+--------------------+| charlie@example.com|| david@example.com || eve@example.com |+--------------------+UNION 操作符
Section titled “UNION 操作符”UNION 操作符合并两个或多个 SELECT 语句的结果集并移除重复行。
SELECT column_list FROM table1UNIONSELECT column_list FROM table2;要获取两个网站所有唯一用户电子邮件的单个列表:
SELECT Email FROM WebsiteA_UsersUNIONSELECT Email FROM WebsiteB_Users;结果(注意 ‘charlie@example.com’ 只出现一次):
+--------------------+| Email |+--------------------+| alice@example.com || bob@example.com || charlie@example.com|| david@example.com || eve@example.com |+--------------------+UNION ALL 操作符
Section titled “UNION ALL 操作符”UNION ALL 操作符合并结果集但包含所有重复行。
它比 UNION 更快,因为它不需要检查并移除重复项。当您知道没有重复项或明确希望包含它们时,请使用它。
SELECT Email FROM WebsiteA_UsersUNION ALLSELECT Email FROM WebsiteB_Users;结果(注意 ‘charlie@example.com’ 现在出现两次):
+--------------------+| Email |+--------------------+| alice@example.com || bob@example.com || charlie@example.com|| charlie@example.com|| david@example.com || eve@example.com |+--------------------+INTERSECT 操作符
Section titled “INTERSECT 操作符”INTERSECT 操作符仅返回同时出现在两个结果集中的行。
SELECT Email FROM WebsiteA_UsersINTERSECTSELECT Email FROM WebsiteB_Users;结果(只有 ‘charlie’ 存在于两个表中):
+--------------------+| Email |+--------------------+| charlie@example.com|+--------------------+EXCEPT 操作符
Section titled “EXCEPT 操作符”EXCEPT 操作符返回第一个 SELECT 语句中存在但不出现在第二个 SELECT 语句中的行。(注意:Oracle 使用关键字 MINUS 来实现此功能)。
SELECT Email FROM WebsiteA_UsersEXCEPTSELECT Email FROM WebsiteB_Users;结果(在网站 A 但不在网站 B 的用户):
+-------------------+| Email |+-------------------+| alice@example.com || bob@example.com |+-------------------+