引言
联合查询与连接查询不同,通过UNION 关键字,我们可以将多个查询语句一同执行并将结果集展示出来,不涉及到任何关联关系。
UNION 的含义是“联合,并集,结合”,在MySQL中可以将多个查询语句的结果合并成一个结果集,在MySQL 不支持FULL OUTER JOIN 的情况下,弥补了“并集” 查询的短板。
连接查询相关知识总结,参考《MySQL 基础 ———— 连接查询》。
一、UNION 介绍
UNION 查询非常简单,就是将多个SQL的结果取并集,适用于查询多个功能含义比较类似的表或结果集,同时可以将一条比较复杂的SQL拆分成多条语句。
员工表:
学生表:
联合查询:
SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级 FROM emp
UNION
SELECT stu_id 编号, stu_name 姓名, class_id 所属部门或班级 FROM student
LIMIT 15
上面的SQL语句使用 UNION 关键字将emp 和 student 的查询合并在了一起。如果希望合并多个查询,就可以使用下面的格式进行合并:
查询语句 1
UNION
查询语句 2
UNION
......
二、联合查询的规则
联合查询是有一定使用规则的,如果不加注意,MySQL就有可能执行报错,或意义混乱
1、多条查询语句的查询列数必须保持一致,否则报错。
2、多条查询语句的列值类型和顺序最好保持一致。
3、UNION 关键字默认不查询重复记录,但只要有一个字段不一样就认为是两条记录。
2.1 规则一:查询列数必须保持一致
其实很好理解,如果要将两个结果集合并,那么就需要将列数统一,MySQL对此作了严格的限制,不会以 NULL 值显示没有查询该列的查询记录,这是为了保证数据的准确性,原因是 NULL 也是一种值。
SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级, manager_id FROM emp
UNION
SELECT stu_id 编号, stu_name 姓名, class_id 所属部门或班级 FROM student
2.2 规则二:列值类型和顺序最好保持一致
“最好” 的意思是 “我们可以不这样做,但皮一下并没有什么意义”。
比如,我们将stu_name 与 class_id 调换顺序:
SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级 FROM emp
UNION
SELECT stu_id 编号, class_id 姓名, stu_name 所属部门或班级 FROM student
LIMIT 15
MySQL虽然不会报错,但结果已经不具有什么使用意义了。另外,列的别名其实并不需要完全统一,多条查询语句中如果出现不统一的列名,MySQL会默认使用第一条查询语句的列名。如:
SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级 FROM emp
UNION
SELECT stu_id, stu_name, class_id FROM student
LIMIT 15
但为了保证可读性,建议为每条查询语句指定相同的列名,保持统一格式。
2.3 规则三:UNION 默认去重
UNION 关键字不会查询重复的记录,但重复的记录并不是简简单单的“看上去重复”或“主键重复”,记录中只要有一个字段不一致,UNION 就会老老实实的将他们都查询出来。
三、UNION 与 UNION ALL
UNION 关键字是去重的联合查询,如果非要将所有记录都查询出来,不忽略重复的记录,那么可以使用 UNION ALL ,对比来看一下:
SELECT * FROM emp
UNION
SELECT * FROM emp
UNION 的结果:
SELECT * FROM emp
UNION ALL
SELECT * FROM emp
UNION ALL 的结果:
综上,就是关于 UNION 联合查询的用法总结,欢迎文末留言。