Union: 联合
作用: 把2次或多次查询结果合并起来
要求: 两次查询的列数一致
推荐; 查询的每一列,相对应的列类型也一样.
可以来自于多张表
多次sql语句取出的列名可以不一致,此时,以第1个sql的列名为准
如果不同的语句中取出的行, 有完全相同(每个列的值都相同),
那么相同的行将会合并.(去重复)
如果不去重复,可以加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