Mysql 的 Union 语法 及 面试题

来源:互联网 发布:软件摊销年限 税法 编辑:程序博客网 时间:2024/05/22 04:42

Union: 联合

作用2次或多次查询结果合并起来

要求两次查询的列数一致

推荐查询的每一列,相对应的列类型也一样.

可以来自于多张表

多次sql语句取出的列名可以不一致,此时,以第1sql的列名为准

如果不同的语句中取出的行有完全相同(每个列的值都相同),

那么相同的行将会合并.(去重复)

如果不去重复,可以加all来指定

如果子句中有order by ,limit, 须加(), 推荐放到 所有子句之后,--对最终合并后的结果来排序.

在子句中, order by 配合limit使用才有意义如果order by  不配合limit使用会被语法分析器优化分析时,去除.



从两个不同的表选取字段  :

1:字段数一定要相等 不然怎么合并??

2:就算字段类型不一样 也可以合并 不会丢失数据 乱码什么的  因为它就是一个结果集  取出来了  而丢失数据 乱码 只是对应的 插入数据时所说的~!~



句里面不能用order by 为什么呢?

因为 里面排了 最后的结果集又能达到一样的效果来排序 譬如 要按cat_id shop_price 来排序  在里面排了 浪费资源

因为在最后的结果集也可以排  order by cat_id desc,shop_price asc 效果是一样的




但是order by 里面有LIMIT D 的话能正常使用!!

为什么呢?

因为这个limit 能确实影响到结果集 因为limit了 就是结果集会限制了条数 所以是有效的



面试题



由于Union 在合并的时候 如果出现完全一样的行 会被覆盖

所以这样合并 两个C就变成了一个  所以

这这里要用union all 不会合并

思路:只要合并以后 再按group by  id  然后打印sum(num) 就OK了!




思考:能用左链接吗??

答:好像不能

出现问题

1:a 没有对应的a 用null 补齐  但是5+null =null  不能得到5;

2:由于左链接按a表为基础 没有e;

3:由于只有inner join 求交集  而没有outer join 就并集 但能用union 代替 就体现在这里了




左链接 Union 右连接  在用了ifnull(ex1,ex2)  如果不为null 则取ex1   为null 则取 ex2

原创粉丝点击