这是命令行操作MySQL数据库系列博客的第二十篇,今天这篇博客记录联合查询中的合并查询。意思是将2至n张表的数据无条件合并到一张新表中显示。
在MySQL中通过关键字UNION来实现合并操作,即可以通过其将多个SELECT语句的查询结果合并在一起,组成新的关系。在MySQL软件中,合并查询数据记录可通过SQL语句UNION来实现,具体语法形式如下:
select 字段1, 字段2, ..., 字段n from 表名1 UNION | UNION ALL select 字段1, 字段2, ..., 字段n from 表名2
注意: 多个选择语句select 的列数相同就可以合并,union和union all的主要区别是union all是把结果集直接合并在一起,而union 是将union all后的结果再执行一次distinct,去除重复的记录后的结果。
查询的字段列数一定要相等才可以进行合并查询,否则会查询失败。
UNION ALL:无条件将查询结果合并在一起;
UNION:无条件将查询结果合并在一起,并去重。
例:
创建class表和student表,并插入数据:
# 创建class表
create table class(id int AUTO_INCREMENT PRIMARY KEY, class_name varchar(128), teacher varchar(128));
# 插入数据
insert into class values(101, 'C语言班', '红老师'), (102, 'C++班', '绿老师'), (103, 'qt班', '蓝老师');
# 创建student表
create table student(id int AUTO_INCREMENT PRIMARY KEY, student_name varchar(128), sex enum('M', 'F'), class_id int);
# 插入数据
insert into student values(1, '小黄', 'M', 101), (2, '小白', 'M', 103), (3, '小紫', 'F', 101), (4, '小黑', 'M', 103);
-
例一
统计全校一共有多少名老师和学生select teacher as people from class UNION ALL select student_name as people from student;
as:转换别名 -
例二
合并多个字段select class_name, teacher from class UNION ALL select sex, student_name from student;
虽说可以合并,但是这样合并的结果,感觉怪怪的,所以一般情况下很少会这样使用。 -
例三
合并所有idselect id from class UNION ALL select class_id from student;
但这样有一个问题,合并的结果双双重复了。这时候, UNION就起到了作用。 -
例四
使用UNION进行合并idselect id from class UNION select class_id from student;
可以看到,合并出来的结果,已经去重了。
总结:
使用合并查询需要注意,UNION查询合并,并去重;UNION ALL仅查询合并;且查询合并表的字段一定得相等(是查询时候写的字段一定要相等),否则会查询失败;可以查询合并多张表。