SQL 组合查询
组合查询
在 SQL 中,组合查询(Combined Queries)允许你将多个查询的结果集合并成一个结果集。这在需要从多个表中检索数据并将其合并显示时非常有用。组合查询通常使用 UNION 和 UNION ALL 来实现。
1. UNION
UNION 用于组合两个或多个 SELECT 语句的结果集,并自动去除重复的行。
语法:
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
column1, column2, ...:要选择的列,必须在所有查询中具有相同的名称和数据类型。table1, table2, ...:要查询的表。
2. UNION ALL
UNION ALL 也用于组合两个或多个 SELECT 语句的结果集,但不会去除重复的行。这在需要保留所有重复行时非常有用。
语法:
SELECT column1, column2, ...
FROM table1
UNION ALL
SELECT column1, column2, ...
FROM table2;
3. INTERSECT
INTERSECT 用于返回两个查询结果集的交集,即两个结果集中都存在的记录。需要注意的是,INTERSECT 在某些数据库系统(如 MySQL)中不支持。
语法:
SELECT column1, column2, ...
FROM table1
INTERSECT
SELECT column1, column2, ...
FROM table2;
4. EXCEPT 或 MINUS
EXCEPT(在 SQL Server 中)或 MINUS(在 Oracle 中)用于返回两个查询结果集的差集,即第一个结果集中存在但第二个结果集中不存在的记录。需要注意的是,EXCEPT 和 MINUS 在某些数据库系统(如 MySQL)中不支持。
语法:
SELECT column1, column2, ...
FROM table1
EXCEPT
SELECT column1, column2, ...
FROM table2;
示例:
假设有两个表 employees 和 contractors,数据如下:
employees 表:
| 1 | Alice | Developer |
| 2 | Bob | Manager |
| 3 | Charlie | Designer |
contractors 表:
| 1 | David | Consultant |
| 2 | Eve | Analyst |
| 3 | Alice | Developer |
UNION
将两个表中的数据合并,显示所有员工和承包商的名称和角色:
SELECT name, role
FROM employees
UNION
SELECT name, role
FROM contractors;
结果:
| Alice | Developer |
| Bob | Manager |
| Charlie | Designer |
| David | Consultant |
| Eve | Analyst |
UNION ALL:
将两个表中的数据合并,显示所有员工和承包商的名称和角色,保留重复行:
SELECT name, role
FROM employees
UNION ALL
SELECT name, role
FROM contractors;
结果:
| Alice | Developer |
| Bob | Manager |
| Charlie | Designer |
| David | Consultant |
| Eve | Analyst |
| Alice | Developer |
INTERSECT:
查询两个表中都存在的记录:
SELECT name, role
FROM employees
INTERSECT
SELECT name, role
FROM contractors;
结果:
| Alice | Developer |
EXCEPT 或 MINUS
查询 employees 表中存在但 contractors 表中不存在的记录:
SELECT name, role
FROM employees
EXCEPT
SELECT name, role
FROM contractors;
结果:
| Bob | Manager |
| Charlie | Designer |
总结
通过使用 UNION 和 UNION ALL,可以将多个查询的结果集合并成一个结果集。UNION 会自动去除重复的行,而 UNION ALL 会保留所有重复行。此外,INTERSECT 用于返回两个结果集的交集,EXCEPT 或 MINUS 用于返回两个结果集的差集。掌握这些组合查询的用法,可以帮助你更灵活地处理和分析数据。

