union能将两个或多个select查询结果合并起来,前提是多个select查询返回的列数目相同。
让我们来看一个简单的实例,使用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 | +------+------+
实例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