mysql中的union用法以及子查询综合应用
2018-03-11 16:09
459 查看
union查询就是把2条或者多条sql语句的查询结果,合并成一个结果集。
如:sql1: N行,sql2: M行,sql1 union sql2 ---> N+M行
1、能否从2张表查询再union呢?
可以,union 合并的是"结果集",不区分在自于哪一张表.
2、取自于2张表,通过"别名"让2个结果集的列一致。那么,如果取出的结果集,列名字不一样,还能否union.
可以,而且取出的最终列名,以第1条sql为准
3、union满足什么条件就可以用了?
只要结果集中的列数一致就可以.(如都是2列或者N列)
4、union后结果集,可否再排序呢?
可以的。Sql1 union sql2 order by 字段
注意: order by 是针对合并后的结果集排的序.
5、如果Union后的结果有重复(即某2行,或N行,所有的列,值都一样),怎么办?
这种情况是比较常见的,默认会去重.
6、如果不想去重怎么办?
union all
下面通过实例来验证union的常用特性以及应用:
1,union会去掉重复的行
2、order by对union后的结果集排序
3、UNION ALL不会过滤重复的行
4、把num_a和num_b不同的索引结果保留, 相同的索引结果相加 然后输出:
5、第二种方法用子查询分组统计,也可以达到同样的效果
如:sql1: N行,sql2: M行,sql1 union sql2 ---> N+M行
1、能否从2张表查询再union呢?
可以,union 合并的是"结果集",不区分在自于哪一张表.
2、取自于2张表,通过"别名"让2个结果集的列一致。那么,如果取出的结果集,列名字不一样,还能否union.
可以,而且取出的最终列名,以第1条sql为准
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;
相关文章推荐
- Postgresql UNION & UNION ALL 用法以及应用场景.md
- mysql中多个left join子查询写法以及别名用法
- Mysql 升序降序用法以及分页查询(每页需要查询的记录行数)
- MySql中查询缓存以及sql_cache、sql_buffer_result用法
- MySQL Union合并查询数据及表别名、字段别名用法分析
- mysql的union连接查询
- (转)sql多表查询,Oracle、mysql的用法区别
- mysql group by内排序的实现以及having和where 条件语句查询的区别
- SQL with as 的用法 以及递归函数的写法 递归层次查询
- MySQL锁类型以及子查询锁表问题、解锁
- mysql查询所有用户以及权限相关
- 两张图解读Oracle 数据库的 union all、union、intersect、minus以及各种连接查询。
- mysql联合查询union
- Java回调以及线程综合应用实例
- Windows下MySQL日志基本的查看以及导入导出用法教程
- MySQL5.7.20源码安装以及pt-query-digest用法示例
- MySQL中UNION和UNION ALL的用法区别
- mysql 分组查询以及显示各个分组所有的温度和时间要用GROUP_CONCAT
- SQL查询金额去掉小数点后面的零,以及SUBSTRING的用法
- [MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)