这里有张 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 |
±----------------±-----------±-----------±-------------±--------------+
如果一个国家的面积超过300万平方公里,或者人口超过2500万,那么这个国家就是大国家。
编写一个SQL查询,输出表中所有大国家的名称、人口和面积。
例如,根据上表,我们应该输出:
±-------------±------------±-------------+
| name | population | area |
±-------------±------------±-------------+
| Afghanistan | 25500100 | 652230 |
| Algeria | 37100000 | 2381741 |
±-------------±------------±-------------+
法一:
select name, population, area
from World
where area > 3000000 or population > 25000000;
但此方法不走索引。
法二:使用两个union代替or:
select name, population, area
from World
where area > 3000000
union
select name, population, area
from World
where population > 25000000;
速度可能会比法一快,因为当使用or对两列进行范围查找时,会使用一次索引,而or的另一个条件会全表扫描,因此使用union将两次查找的结果结合起来比较快,但由于union会将两个查询的结果去重(union all不会),因此此时可能也会有性能损耗。当or的两个条件都是针对同一列时,两个条件都会使用该列的索引。