[mysql基础文档]-31-union查询

引言

union能将两个或多个select查询结果合并起来,前提是多个select查询返回的列数目相同。

文章目录

0×1.如何使用union查询

让我们来看一个简单的实例,使用union连接两个select查询的结果集:

						--假设有表a和表b,内容如下
						mysql> select * from a;
						+------+------+
						| id   | num  |
						+------+------+
						| a    |    5 |
						| b    |   10 |
						| c    |   15 |
						| d    |   10 |
						+------+------+

						mysql> select * from b;
						+------+------+
						| id   | num  |
						+------+------+
						| b    |    5 |
						| c    |   15 |
						| d    |   20 |
						| e    |   99 |
						+------+------+

						--使用union将前后两条select返回的结果连接起来,union操作时,前后两条select所返回的列数目必须相同,本例前后select都返回两列数据,并且,在连接的时候,union将完全相同的记录合并成一条显示(必须是记录完全相同,只有单个字段相同并不会合并),本例中"c 15"是两个表中都共有并完全相同的一条记录,所以合并成一条显示
						mysql> select id,num from a
						    -> union
						    -> select id,num from b;
						+------+------+
						| id   | num  |
						+------+------+
						| a    |    5 |
						| b    |   10 |
						| c    |   15 |
						| d    |   10 |
						| b    |    5 |
						| d    |   20 |
						| e    |   99 |
						+------+------+

						--如果想要union加快合并速度,不将相同的记录合并,可以在union后面添加all参数,如下,"c 15"出现了两次
						mysql> select id,num from a
						    -> union all
						    -> select id,num from b;
						+------+------+
						| id   | num  |
						+------+------+
						| a    |    5 |
						| b    |   10 |
						| c    |   15 |
						| d    |   10 |
						| b    |    5 |
						| c    |   15 |
						| d    |   20 |
						| e    |   99 |
						+------+------+

						--union不仅仅只能合并两张表数据,可以用下面的语法合并任意多个表,前提是他们的列数目必须相同
						mysql> select id,num from a
						    -> union
						    -> select id,num from b
						    -> union
						    -> select id,num from c
						    -> union
						    -> select id,num from d
						    -> union
						    -> ....; --此处可以重复上面的结构连接不同的表

						--在union连接的select中使用order by排序毫无意义(比如select * from a order by num desc union all select....),数据库会自动将这种语句优化掉,但是可以对union后的总表进行order by排序,例如
						mysql> select id,num from a
						    -> union
						    -> select id,num from b
						    -> order by num desc;
						+------+------+
						| id   | num  |
						+------+------+
						| e    |   99 |
						| d    |   20 |
						| c    |   15 |
						| b    |   10 |
						| d    |   10 |
						| a    |    5 |
						| b    |    5 |
						+------+------+
					

0×2.union查询实例

实例1,要求将本文第一部分给出的a,b两表使用union联合,并将相同id的num值相加,输出id以及num相加后的结果

							--首先将步骤拆分,可以先求出a和b表的union结果集,将这个结果集当做一个子查询,将其定义成tmp表,外层select查询就是对这个tmp表的查询,最后使用id对tmp表进行分组,再用sum()函数将相同id分组的num值相加,最后得到下面的结果,子查询联合时使用了union all,因为两表有同一条记录"c 15",如果不使用all参数,它们将被合并成一条记录,这不符合题目要求。
							mysql> select id,sum(num)
							    -> from
							    -> (select * from a union all select * from b) as tmp
							    -> group by id;
							+------+----------+
							| id   | sum(num) |
							+------+----------+
							| a    |        5 |
							| b    |       15 |
							| c    |       30 |
							| d    |       30 |
							| e    |       99 |
							+------+----------+
						

实例2,计算本文第一部分表a中num列所有字段的和,将其结果union到表a的底部,id字段填充'Total:'

							--当union前后列的列头名称不同时,union使用前面的那select中的列头名称作为联合表的列头名称
							mysql> select * from a
							    -> union
							    -> select 'Total:',sum(num) from a;
							+--------+------+
							| id     | num  |
							+--------+------+
							| a      |    5 |
							| b      |   10 |
							| c      |   15 |
							| d      |   10 |
							| Total: |   40 |
							+--------+------+