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