6 UNION 和 UNION ALL
合并查询结果 利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。
各个SELECT语句之间使用UNION或UNION ALL关键字分隔。
语法格式:
SELECT column,... FROM table1 UNION [ALL] SELECT column,... FROM table2
5.1 UNION
UNION:会执行去重操作
UNION 操作符返回两个查询的结果集的并集,去除重复记录。
5.2 UNION ALL
UNION ALL:不会执行去重操作
UNION ALL 操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。
注意:
执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。(不用去重提高效率)
7 7种SQL JOINS的实现
基于 employees、departments 两张表实现上图七种连接操作。
7.1 左上图:左外连接
# 左上图:左外连接 SELECT e.employee_id, d.department_id FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id;
7.2 右上图:右外连接
# 右上图:右外连接 SELECT e.employee_id, d.department_id FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id;
7.3 左中图
左中图要查询的部分为左外连接去除内连接的部分,即筛选出两表根据连接条件进行连接后右表为空的部分。
# 左中图 SELECT e.employee_id, d.department_id FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id WHERE d.department_id IS NULL ;
7.4 中图:内连接
# 中图:内连接 SELECT e.employee_id, d.department_id FROM employees e JOIN departments d ON e.department_id = d.department_id;
7.5 右中图
右中图要查询的部分为右外连接去除内连接的部分,即筛选出两表根据连接条件进行连接后左表为空的部分。
# 右中图 SELECT e.employee_id, d.department_id FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id WHERE e.employee_id IS NULL ;
7.6 左下图:满外连接
左下图可以由左上图与右上图进行并集操作实现,或由左上图与右中图进行并集操作实现,或由左中图与右上图进行并集操作实现。
通过由左上图与右上图进行并集操作实现,还有执行去重操作,只能使用 UNION ,而通过左上图与右中图进行并集操作实现,或左中图与右上图进行并集操作实现,不需要进行去重操作,可以使用 UNION ALL。
对比之下,通过左上图与右中图进行并集操作实现,或左中图与右上图进行并集操作实现,效率更高。
# 左上图:左外连接 SELECT e.employee_id, d.department_id FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id UNION ALL # 右中图 SELECT e.employee_id, d.department_id FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id WHERE e.employee_id IS NULL ;
# 右上图:右外连接 SELECT e.employee_id, d.department_id FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id UNION ALL # 左中图 SELECT e.employee_id, d.department_id FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id WHERE d.department_id IS NULL ;