数据库每日一题---第3天:大的国家
一、问题描述
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| name | varchar |
| continent | varchar |
| area | int |
| population | int |
| gdp | int |
+-------------+---------+
name 是这张表的主键。
这张表的每一行提供:国家名称、所属大陆、面积、人口和 GDP 值。
如果一个国家满足下述两个条件之一,则认为该国是 大国 :
面积至少为 300 万平方公里(即,3000000 km2km^2km2),或者
人口至少为 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('','')操作会更好。

转载自:https://juejin.cn/post/7103879147516067870