一、问题描述
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| name | varchar |
| continent | varchar |
| area | int |
| population | int |
| gdp | int |
+-------------+---------+
name 是这张表的主键。
这张表的每一行提供:国家名称、所属大陆、面积、人口和 GDP 值。
复制代码
如果一个国家满足下述两个条件之一,则认为该国是 大国 :
面积至少为 300
万平方公里(即,3000000 km2),或者人口至少为 2500
万(即 25000000)编写一个 SQL 查询以报告 大国 的国家名称、人口和面积。
按 任意顺序 返回结果表。
题目链接:大的国家
二、题目要求
样例
输入:
World 表:
+-------------+-----------+---------+------------+--------------+
| name | continent | area | population | gdp |
+-------------+-----------+---------+------------+--------------+
| Afghanistan | Asia | 652230 | 25500100 | 20343000000 |
| Albania | Europe | 28748 | 2831741 | 12960000000 |
| Algeria | Africa | 2381741 | 37100000 | 188681000000 |
| Andorra | Europe | 468 | 78115 | 3712000000 |
| Angola | Africa | 1246700 | 20609294 | 100990000000 |
+-------------+-----------+---------+------------+--------------+
输出:
+-------------+------------+---------+
| name | population | area |
+-------------+------------+---------+
| Afghanistan | 25500100 | 652230 |
| Algeria | 37100000 | 2381741 |
+-------------+------------+---------+
复制代码
考察
1.条件查询、union
2.建议用时10~25min
复制代码
三、问题分析
1.条件查询
这一题一开始看就是一道普通的where
条件查询的语句,我们只需要用or
连接两个条件进行判断。只要这一行记录符合两个条件其中的一个就可以。
2.union 连接
union
本质是离散数学并的概念,但在数据库中使用起来却有大不同。使用union
连接数据会自动对相同的元素进行去重操作并进行默认规则的排序,而union all
不会去重操作和排序操作。
从执行效率来说,union all
比union
少了去重,所以用时更少。
3.对比总结
但看到评论区对于这两种方法的区别进行了探讨,这里我也说一下我的小小见解。
使用or
进行条件查询,对于单个的列来说并没有问题,但是对于多个列来讲。每次select
只能够选择一个 index,如果选择area
,那么对于population
不会跳过,而是会重新遍历。这种情况下,使用union
分成两次查询就会,索引的调用次数会少很多。
四、编码实现
1.条件查询
select name,population,area
from World
where area>=3000000 or population>=25000000
复制代码
2.union 连接
select name,population,area
from World
where area>=3000000
union
select name,population,area
from World
where population>=25000000
复制代码
五、测试结果
第一行是union
,第二行是条件查询。
如果是相同列的查询建议使用 where in('','')
操作会更好。
评论