数据库每日一题---第3天:大的国家

1,406 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

一、问题描述

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| name        | varchar |
| continent   | varchar |
| area        | int     |
| population  | int     |
| gdp         | int     |
+-------------+---------+
name 是这张表的主键。
这张表的每一行提供:国家名称、所属大陆、面积、人口和 GDP 值。

如果一个国家满足下述两个条件之一,则认为该国是 大国

面积至少为 300 万平方公里(即,3000000 km2km^2),或者 人口至少为 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 allunion 少了去重,所以用时更少。

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

五、测试结果

1.png

第一行是union,第二行是条件查询。

如果是相同列的查询建议使用 where in('','')操作会更好。

19.png