MySQL之union联合查询的实现
作者:白云如幻
UNION 的含义是“联合,并集,结合”,在MySQL中可以将多个查询语句的结果合并成一个结果集,在MySQL 不支持FULL OUTER JOIN 的情况下,弥补了“并集” 查询的短板。
联合查询:
关键字union,作用就是将多条查询语句的结果合并成一个结果集。
案例:(查询部门编号大于100或名字中含有a字符的员工信息)
select * from employees where department_id>100 or last_name like '%a%';
用联合查询演示:
select * from employees where department_id>100 union select * from employees where last_name like '%a%';
union是应用场景:
比如在我们有个数据库中的老师表和学生表,两者之间没有直接的关联关系,但是又有一些共通性,但是现在我们想要查询学校所有男老师和男学生的信息(学生和老师的编号,姓名,出现日期,性别),这个时候就是应用union的时候。
SELECT `tno` 编号,`tname`,`tsex`,`tbirthday` FROM `teachers` WHERE `tsex`='男' UNION SELECT `sno`,`sname`,`ssex`,`sbirthday` FROM `students` WHERE `ssex`='男';
联合查询的特点:
- 联合查询的两个子查询的查询字段个数要一致
- 要求联合查询的子查询的查询列表顺序要在内容上保持一致
- 使用union联合默认会自动去重,如果不想去重可以将union改为union all
联合查询的规则
联合查询是有一定使用规则的,如果不加注意,MySQL就有可能执行报错,或意义混乱
1、多条查询语句的查询列数必须保持一致,否则报错。
2、多条查询语句的列值类型和顺序最好保持一致。
3、UNION 关键字默认不查询重复记录,但只要有一个字段不一样就认为是两条记录。
规则一:查询列数必须保持一致
其实很好理解,如果要将两个结果集合并,那么就需要将列数统一,MySQL对此作了严格的限制,不会以 NULL 值显示没有查询该列的查询记录,这是为了保证数据的准确性,原因是 NULL 也是一种值。
SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级, manager_id FROM emp UNION SELECT stu_id 编号, stu_name 姓名, class_id 所属部门或班级 FROM student
规则二:列值类型和顺序最好保持一致
“最好” 的意思是 “我们可以不这样做,但皮一下并没有什么意义”。
比如,我们将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
但为了保证可读性,建议为每条查询语句指定相同的列名,保持统一格式。
规则三: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 的结果:
到此这篇关于MySQL之union联合查询的实现的文章就介绍到这了,更多相关MySQL union联合查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!