第十章 组合查询的妙用

 组合查询可以将多个select 结果拼接在一起作为最终的结果输出。

  1.  组合查询的使用场景
  2. union 和 union all 的区别
  3.  组合查询结果的排序
  • 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实现,

使用组合查询可以实现全外连接的操作

组合查询的易错点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值