组合查询可以将多个select 结果拼接在一起作为最终的结果输出。
- 组合查询的使用场景
- union 和 union all 的区别
- 组合查询结果的排序
-
10.1 何时使用组合查询
多个查询结果 ,比如a表中,b表中的
-
10.2 union 和 union all
组合查询包括union 和 union all两种方法,区别在于
union会对组合后的结果进行去重处理,union all会将组合后的结果直接拼接,并不进行去重处理
下边用一个例子进行对比,创建2张表 table_a和table_b,并导入数据
#创建表
drop table if exists table_a;
create table table_a(
a_name varchar(8),#用户名字
a_age int#
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8;
insert into
table_a(a_name,a_age)
value('Alice',18)
,('Bob',29)
,('Allen',22)
,('Kitty',27)
,('Jack',23);
select * from table_a;
#创建表
drop table if exists table_b;
create table table_b(
b_name varchar(8), #
b_age int
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8;
insert into
table_b(b_name,b_age)
value('Alice',18)
,('Bob',29)
,('Kevin',30)
,('Anne',24)
,('Jean',29);
select * from table_b;
a
b
用union进行组合查询
SELECT *
from table_a
union
SELECT *
from table_b;
union作用将表纵向连接。原始的两张表各有5条数据,使用union之后的结果为8条数据
有2条数据(Alice和Bob)重复了,union会对连接后的结果进行去重处理。
可以发现,两张表在使用UNION后,新表的字段名为先出现的那张表的字段名,即table_a表的字段名a_name和a_age.
将union改成 union all
SELECT *
from table_a
union all
SELECT *
from table_b;
对比使用union的结果,使用union all的结果中存在10条记录,其中有重复的记录,即(Alice和Bob)
两者最大区别,union会对组合后的结果进行去重处理,union all会将组合后的结果直接拼接,并不进行去重处理
-
10.3组合查询的易错点
- 两张表的内容需要对齐,包括列数需要一致,顺序需要一致
SELECT *,1
from table_a
union all
SELECT *
from table_b;
异常原因: 列数不等
- 如果列的字段内容不对应,示例代码如下:
SELECT a_age,a_name
from table_a
union
SELECT b_name,b_age
from table_b;
虽然结果没有抛出异常,但连接后的表数据错乱,这样的数据已经没有意义了。
- 关于union之后的排序,order by应该被写在最后,因为此时不是对每部分结果排序,而是对最终结果排序。
SELECT *
from table_a
union
SELECT*
from table_b
order by a_age;
- 若是先对每部分排序,再使用union,可能会写出如下代码
SELECT *
from table_a
order by a_age
union
SELECT*
from table_b
order by b_age;
代码会抛出异常
Error Code: 1221. Incorrect usage of UNION and ORDER BY
-
10.4小结
本章介绍了组合查询,组合查询可以将表纵向拼接,适合将多个查询的结果组合
以及通过union 和 union all实现,
使用组合查询可以实现全外连接的操作
组合查询的易错点