No.595-Big Countries-(LeetCode之Database篇)
数据库表
给出的数据库表如下,表名为World。
+—————–+————+————+————–+—————+
| name | continent | area | population | gdp |
+—————–+————+————+————–+—————+
| Afghanistan | Asia | 652230 | 25500100 | 20343000 |
| Albania | Europe | 28748 | 2831741 | 12960000 |
| Algeria | Africa | 2381741 | 37100000 | 188681000 |
| Andorra | Europe | 468 | 78115 | 3712000 |
| Angola | Africa | 1246700 | 20609294 | 100990000 |
+—————–+————+————+————–+—————+
问题表述
如果一个国家的面积大于三百万平方公里,或者人口数大于两千五百万,那么这个国家就是一个大国。
写一个SQL语句将大国的name、population、area选择出来。
问题解决
下面是我写的SQL语句:
select name,population,area
from World
where area >= 3000000 or population >= 25000000
提交后结果是正确的。提交后我去了讨论区,发现有更好的解决方案:
SELECT name, population, area
FROM World
WHERE area > 3000000
UNION
SELECT name, population, area
FROM World
WHERE population > 25000000
可以看到上面这个SQL语句执行速度是要略快于第一个SQL的,这是为什么呢?
第一个SQL我们使用了OR,第二个SQL我们使用的是UNION。
用OR的子句可以分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用 UNION ALL执行的效率更高,但是UNION ALL不会去除重复的行。
采用OR不会用到索引,改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。所以我们再使用SQL查询时尽量使用UNION,如果对重复列没有要求,则尽量使用UNION ALL。