[Mysql] 组合查询

组合查询可以将多个SELECT结果拼接在一起作为最终结果输出(输出组合成单个查询结果集)

当存在多个查询结果符合条件,需要将多个查询结果进行纵向拼接时,就会用到组合查询

如下图所示,如果需要查出的结果包含表A和表B两个部分,则组合查询的结果相当于将这两部分纵向组合在一起

有两种基本情况,需要使用组合查询:

1.在单个查询中从不同的表返回类似结构的数据

2.对单个表执行多个查询,按单个查询返回数据

组合查询可以应用在相同的表,也可以应用在不同的表

UNION 与 UNION ALL

在组合查询中,包括UNION和UNION ALL两种方法

UNION几乎总是完成与多个WHERE条件相同的工作。UNION ALL为UNION的一种形式,它完成WHERE子句完成不了的工作。如果确实需要每个条件的匹配行全部出现(包括重复行),则必须使用UNION ALL而不是WHERE

两者的区别

UNION会将组合后的结果进行去重处理

UNION ALL会将组合的结果直接拼接,并不进行去重处理

案例

创建两张表table_a 和 table_b 用来对比UNION与UNION ALL

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); 

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);

使用UNION进行组合查询

SELECT * 
FROM table_a 
UNION 
SELECT * 
FROM table_b;

使用UNION的结果

UNION的作用是将表纵向连接。原始的两张表各有5条数据,在使用UNION之后的结果有8条数据,这是因为有两条数据(Alice和Bob)重复了,而UNION会对连接后的结果进行去重处理。可以发现,两张表在使用UNION后,新表的字段名为先出现的那张表的字段名,即table_a表的字段名a_name和a_age

使用UNION ALL进行组合查询

SELECT * 
FROM table_a 
UNION ALL 
SELECT * 
FROM table_b;

使用UNION的结果

对比使用UNION的结果,使用UNION ALL的结果中存在10条记录,其中有重复的记录,即Alice和Bob

组合查询的易错点

1.组合查询的两张表的内容需要对齐,包括列数需要一致,顺序需要一致

SELECT *,1 
FROM table_a 
UNION 
SELECT * 
FROM table_b;

抛出异常,发现异常原因是列数不等:

2.组合查询应避免出现列的字段内容不对应的情况

SELECT a_age,a_name
FROM table_a 
UNION 
SELECT b_name,b_age 
FROM table_b;

使用UNION时列的字段内容不对应 

结果如下图所示:

虽然结果没有抛出异常,但是连接后的表数据错乱,这样的数据已经没有意义了。所以在使用UNION或者UNION ALL进行连接操作时,应当注意连接的结果

3.关于UNION之后的排序,ORDER BY应该写在最后

不是对每部分结果排序,而是对最终结果排序

SELECT语句的输出用ORDER BY子句排序。在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。对于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况,因此不允许使用多条ORDER BY子句

SELECT * 
FROM table_a 
UNION 
SELECT * 
FROM table_b 
ORDER BY a_age;

在上述查询代码中,最后一条SELECT语句后使用了ORDER BY子句

虽然ORDER BY子句似乎只是最后一条SELECT语句的组成部分,但实际上MySQL将用它来排序所有SELECT语句返回的所有结果  

结果如下图所示:

如果先对每部分排序,再使用UNION,则会抛出异常

SELECT * 
FROM table_a 
ORDER BY a_age 
UNION 
SELECT * 
FROM table_b 
ORDER BY b_age;

结果如下所示:

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值