mysql合并结果集(union,unionall)
我需要在⼀个sql的执⾏结果中,显⽰两个或两个以上的where条件的结果(select 列的结构相同)。
考虑使⽤union,或union all 。
union 与 union all 执⾏结果不同
UNION 删除重复的记录再返回结果,即对整个结果集合使⽤了DISTINCT。结果中⽆重复数据。
UNION ALL 将各个结果合并后就返回,不删除重复记录。如果结果中有重复数据,则包含重复数据。
例如,
mysql> SELECT * FROM world.city where ID=2020 UNION SELECT * FROM world.city where ID=2020;
+------+-------+-------------+--------------+------------+
| ID  | Name  | CountryCode | District    | Population |
+------+-------+-------------+--------------+------------+
| 2020 | Tieli | CHN        | Heilongjiang |    265683 |
+------+-------+-------------+--------------+------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM world.city where ID=2020 UNION ALL SELECT * FROM world.city where ID=2020;
+------+-------+-------------+--------------+------------+
| ID  | Name  | CountryCode | District    | Population |
+------+-------+-------------+--------------+------------+
| 2020 | Tieli | CHN        | Heilongjiang |    265683 |
| 2020 | Tieli | CHN        | Heilongjiang |    265683 |
+------+-------+-------------+--------------+------------+
2 rows in set (0.00 sec)
对UNION,UNION ALL的结果继续处理,需要加括号
⽐如要对合并后的结果集进⾏ORDER BY,LIMIT等操作需要对合并对象单个的SELECT语句加上括号。
并且把整体结果的条件ORDER BY,LIMIT等放到最后⼀个SELECT的括号后⾯。
例如,
(SELECT*FROM world.city
WHERE CountryCode ='JPN'AND Name LIKE'nishi%')
UNION ALL
(SELECT*FROM world.city
WHERE CountryCode ='CHN'AND Population >=5000000)
LIMIT5;
mysql中,UNION,UNION ALL的性能/效率不同
从效率上说,UNION ALL 要⽐UNION快很多。
sql中union多表合并所以,如果可以确认合并的结果集中不包含重复的数据的话,或者需要的结果中即使包含重复也⽆所谓,那么就使⽤UNION ALL。
UNION
UNION在进⾏表链接后会筛选掉重复的记录,所以在表链接后会对所产⽣的结果集进⾏排序运算。
UNION在运⾏时先取出各个表/各个select的结果,再⽤排序空间进⾏排序删除重复的记录,最后返回结果集,如果表数据量⼤的话可能会导致⽤磁盘进⾏排序。
UNION ALL
UNION ALL只是简单的将结果合并后就返回。不涉及排序运算。
(以上。)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。