mysql中的union⽤法以及⼦查询综合应⽤union查询就是把2条或者多条sql语句的查询结果,合并成⼀个结果集。
如:sql1: N⾏,sql2: M⾏,sql1 union sql2 ---> N+M⾏
1、能否从2张表查询再union呢?
可以,union 合并的是"结果集",不区分在⾃于哪⼀张表.
2、取⾃于2张表,通过"别名"让2个结果集的列⼀致。那么,如果取出的结果集,列名字不⼀样,还能否union.
可以,⽽且取出的最终列名,以第1条sql为准
exists子查询3、union满⾜什么条件就可以⽤了?
只要结果集中的列数⼀致就可以.(如都是2列或者N列)
4、union后结果集,可否再排序呢?
可以的。Sql1 union sql2 order by 字段
注意: order by 是针对合并后的结果集排的序.
5、如果Union后的结果有重复(即某2⾏,或N⾏,所有的列,值都⼀样),怎么办?
这种情况是⽐较常见的,默认会去重.
6、如果不想去重怎么办?
union all
下⾯通过实例来验证union的常⽤特性以及应⽤:
CREATE TABLE num_a (
id VARCHAR( 3 ) NOT NULL,
num INT(3 ) UNSIGNED NOT NULL
)CHARSET utf8 ENGINE MYISAM;
CREATE TABLE num_b (
id VARCHAR( 3 ) NOT NULL,
num INT(3 ) UNSIGNED NOT NULL
)CHARSET utf8 ENGINE MYISAM;
INSERT INTO num_a VALUES ( 'a', 5 );
INSERT INTO num_a VALUES ( 'b', 10 );
INSERT INTO num_a VALUES ( 'c', 15 );
INSERT INTO num_a VALUES ( 'd', 10 );
INSERT INTO num_b VALUES ( 'b', 5 );
INSERT INTO num_b VALUES ( 'c', 15 );
INSERT INTO num_b VALUES ( 'd', 20 );
INSERT INTO num_b VALUES ( 'e', 99 );
1,union会去掉重复的⾏
SELECT id,num FROM num_a UNION SELECT id, num FROM num_b
2、order by对union后的结果集排序
SELECT id,num FROM num_a UNION SELECT id, num FROM num_b ORDER BY num DESC
3、UNION ALL不会过滤重复的⾏
SELECT id,num FROM num_a UNION ALL SELECT id, num FROM num_b
4、把num_a和num_b不同的索引结果保留,相同的索引结果相加然后输出:
SELECT a.id, ( a.num + b.num ) AS num FROM num_a AS a INNER JOIN num_b AS b ON a.id = b.id
UNION ALL
SELECT*FROM num_a AS a WHERE NOT EXISTS( SELECT*FROM num_b AS b WHERE a.id = b.id ) UNION ALL
SELECT*FROM num_b AS b WHERE NOT EXISTS( SELECT*FROM num_a AS a WHERE a.id = b.id ) ORDER BY id ASC
5、第⼆种⽅法⽤⼦查询分组统计,也可以达到同样的效果
SELECT id, SUM( num ) AS num FROM ( SELECT*FROM num_a a UNION ALL SELECT*FROM num_b b ) tmp GROUP BY id;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论