MySQL 基础———— UNION 联合查询
引言联合查询与连接查询不同,通过UNION 关键字,我们可以将多个查询语句一同执行并将结果集展示出来,不涉及到任何关联关系。UNION 的含义是“联合,并集,结合”,在MySQL中可以将多个查询语句的结果合并成一个结果集,在MySQL 不支持FULL OUTER JOIN 的情况下,弥补了“并集” 查询的短板。连接查询相关知识总结,参考《MySQL 基础 ———— 连接查询》。一、...
引言
联合查询与连接查询不同,通过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 联合查询的用法总结,欢迎文末留言。
更多推荐
所有评论(0)