转载

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

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

文章目录

  • [1].如何使用union查询
  • [2].union查询实例

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

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

[**] 注:如文中未特别声明转载请注明出自:QingSword.COM

正文到此结束
Loading...