通过组合查询命令,可以实现数据的并集、交集、差集等操作,从而更加灵活地处理和分析数据。
UNION
UNION
用于合并两个或多个 SELECT
语句的结果集。它会自动去除重复的行。在执行 UNION
操作时,要求参与合并的 SELECT
语句选择的列数必须相同,并且对应列的数据类型要兼容。
示例
假设有两个表,一个是 employees_us
(存储美国员工信息),一个是 employees_eu
(存储欧洲员工信息)。这两个表都有 employee_id
、 name
和 department
这几列。
想要获取所有员工的姓名和部门信息,则可以使用以下查询:
SELECT name, department FROM employees_us
UNION
SELECT name, department FROM employees_eu;
这个查询会将两个表中的姓名和部门组合在一起,并且如果存在相同的姓名和部门组合(假设在同一部门下可能有同名员工),只会显示一次。
UNION ALL
UNION ALL
与 UNION
类似,也是用于合并多个 SELECT
语句的结果集。但是,它不会去除重复的行,而是将所有的行都包含在最终结果集中。
示例
继续以上面的员工表为例,如果我们想要统计包括重复姓名和部门组合的所有记录(例如,可能有同名员工在不同地区分公司的同一部门),可以这样写:
SELECT name, department FROM employees_us
UNION ALL
SELECT name, department FROM employees_eu;
这样得到的结果集包含了来自两个表的所有行,即使存在重复项也不会被过滤掉。
INTERSECT
INTERSECT
用于返回多个 SELECT
语句结果集的公共部分,也就是同时存在于所有参与查询的结果集中的行。同样要求列数相同且数据类型兼容。目前MySQL不支持该命令。
示例
假设还有一个表 employees_high_salary
,存储了高薪员工的信息(也是 employee_id
、 name
和 department
列)。想要找出既在美国员工表又在高薪员工表中的员工姓名和部门,可以使用:
SELECT name, department FROM employees_us
INTERSECT
SELECT name, department FROM employees_high_ salary;
这个查询的结果就是那些既属于美国员工又属于高薪员工范畴的员工的姓名和部门信息。
EXCEPT
EXCEPT
操作符返回左边 SELECT
语句结果集中存在而右边 SELECT
语句结果集中不存在的行。同样遵循列数和数据类型的要求。目前MySQL不支持该命令。
示例
想要找出美国员工中不在欧洲员工表中的员工(可能是在美国独有的业务部门等情况),可以这样写查询:
SELECT name, department FROM employees_us
EXCEPT
SELECT name, department FROM employees_eu;
这样得到的结果集就是美国员工表中有而欧洲员工表中没有的员工姓名和部门信息。