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
用于返回两个结果集的差集。掌握这些组合查询的用法,可以帮助你更灵活地处理和分析数据。