Skip to content

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 操作符合并两个或多个 SELECT 语句的结果集并移除重复行。

SELECT column_list FROM table1
UNION
SELECT column_list FROM table2;

要获取两个网站所有唯一用户电子邮件的单个列表:

SELECT Email FROM WebsiteA_Users
UNION
SELECT 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 操作符合并结果集但包含所有重复行。

它比 UNION 更快,因为它不需要检查并移除重复项。当您知道没有重复项或明确希望包含它们时,请使用它。

SELECT Email FROM WebsiteA_Users
UNION ALL
SELECT 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 操作符仅返回同时出现在两个结果集中的行。

SELECT Email FROM WebsiteA_Users
INTERSECT
SELECT Email FROM WebsiteB_Users;

结果(只有 ‘charlie’ 存在于两个表中):

+--------------------+
| Email |
+--------------------+
| charlie@example.com|
+--------------------+

EXCEPT 操作符返回第一个 SELECT 语句中存在但不出现在第二个 SELECT 语句中的行。(注意:Oracle 使用关键字 MINUS 来实现此功能)。

SELECT Email FROM WebsiteA_Users
EXCEPT
SELECT Email FROM WebsiteB_Users;

结果(在网站 A 但不在网站 B 的用户):

+-------------------+
| Email |
+-------------------+
| alice@example.com |
| bob@example.com |
+-------------------+