如何选择人口最少的国家
Posted
技术标签:
【中文标题】如何选择人口最少的国家【英文标题】:How to select the country with the min population 【发布时间】:2016-01-13 06:44:28 【问题描述】:我知道这是一个非常简单的问题,但我需要有人解释这个查询背后的思考过程。 我有一张与国家相关的大数据表。我想看看哪个国家的人口最少,所以我使用以下查询
SELECT country, MIN(population) AS min_pop FROM countries_by_population;
它返回一个错误,即国家应该在聚合中或在 GROUP BY 中。我很困惑;为什么?这个查询不应该只查看 min(population) 并返回国家名称吗?
在此之后,我将国家添加到这样的 GROUP BY 中
SELECT country, MIN(population) AS min_pop FROM countries_by_population GROUP BY country;
我得到了一张按字母顺序排列的所有国家人口的表格。这是怎么发生的?
在解释了这一点之后,有人可以谈谈正确查询的思考过程吗? 谢谢。
【问题讨论】:
您使用的是哪个 RDBMS? 数据库中有索引吗?GROUP BY
运算符告诉您的数据库将每组国家的结果汇总在一起。对于您的(正确)查询,数据库将返回给定国家/地区每组记录的country
和最小人口。祝你正确查询。
【参考方案1】:
SQL 是关于查询的,即过滤和读/写。
当你这样做时:
SELECT country, MIN(population) AS min_pop FROM countries_by_population;
你打算选择人口最少的国家,这个逻辑是对的——“选择国家”和“人口最少”。然而,这里发生的事情是,一方面,“选择国家”没有过滤,意味着只读取数据,从潜在的“where”子句(你没有)过滤的元组中返回国家。另一方面,MIN()
返回最小值。基本上这里存在不匹配:您想将人口最少的国家/地区配对,但 SQL 不知道如何。
Group By 表示将具有相同值的元组分组。在这种情况下,您只需按国家/地区及其名称进行分组,并且由于国家/地区是独一无二的,因此它们不会超过两个。因此,基本上没有发生视觉上的。
有几种方法可以完成你的任务,其中一种是你可以首先使用 查询最小人口的值select MIN(population) from countries_by_population
,
那你就可以了
select country from countries_by_population where population = minipop
,可以在嵌套查询中,也可以以不同的方式进行。
【讨论】:
这是我使用的最后一个查询 SELECT country, population FROM countries_by_population WHERE population=(SELECT MIN(population) FROM countries_by_population);有什么办法可以缩短吗?顺便说一句,感谢您的详细回复。 @Newton 不客气 :)。此外,我认为这已经足够简化了,您可以这样做 @Newton 我刚想到你可以使用select top 1 * from countries_by_population order by populatioin asc
。它看起来更简单,但正如我所说,这已经足够简单了。【参考方案2】:
GROUP BY 要求在其中指定数学函数中指定的列。
示例:考虑 Employee 表
SELECT NAME, SUM(SALARY) FROM CUSTOMERS
GROUP BY NAME;
这将返回类似这样的结果
+----------+-------------+
| NAME | SUM(SALARY) |
+----------+-------------+
| A | 15000.00 |
| B | 25000.00 |
| C | 35000.00 |
+----------+-------------+
如果你没有在GROUP BY
子句中指定列
SELECT NAME, SUM(SALARY) FROM CUSTOMERS
您将面临以下错误消息。
'Column Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
【讨论】:
【参考方案3】:您将需要GROUP BY
,但您可以做的是
SELECT TOP 1 country, MIN(population) AS min_pop
FROM countries_by_population
GROUP BY country
ORDER BY 2;
假设您使用的是 MSSQL。
【讨论】:
请仔细看看这个问题,OP在问为什么结果是按字母顺序排列的,他没有从SQL中得到任何错误。 主题明确说明他需要什么“如何选择人口最少的国家”以上是关于如何选择人口最少的国家的主要内容,如果未能解决你的问题,请参考以下文章