[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 |
+--------+------+