union就是将两个sql查询接口拼接起来
1.使用场景:当查询相同的内容但是一个sql无法同时满足条件的情况下可以用union来连接两个sql
然后对连接好的查询整体进行order by
注意:两个sql 查询出的字段必须完全一致
sql1 union sql2 order by [查询结果的公共字段]
union前后的每一个sql可以分别加where查询条件互不影响且起作用
2.使用过程中遇到的坑
(1)报错:Incorrect usage of UNION and ORDER BY。
SELECT * FROM a ORDER BY a.id
UNION
SELECT * FROM a ORDER BY a.id
原因是有两个order by ,可以把前一个select的order by去掉,但这样排序就是union 后的整个结果集排序。
(2) 给两个select语句分别加括号,虽然不报错了,但是order by 不起作用。
(SELECT * FROM t1 WHERE 1=1 ORDER BY t1.id DESC)
UNION
(SELECT * FROM t1 WHERE 1=1 ORDER BY t1.id DESC)
还有一种方式是
select * from (SELECT * FROM t1 WHERE 1=1 ORDER BY t1.id DESC) t2
UNION
select * from (SELECT * FROM t1 WHERE 1=1 ORDER BY t1.id DESC) t3
注意子查询后记录要起别名 t2、t3
我在验证过程中发现order by依然不起作用
UNION 和UNION ALL的区别是:
UNION会将两个sql的查询结果去重,UNION ALL不会去重
所以不考虑重复的条件下union all的效率要更高一些