我知道这是一个非常简单的问题,但我需要有人来解释这个查询背后的思考过程。 我有一个与国家有关的大数据表。我想看看哪个国家的人口最少,所以我使用以下查询
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;
我得到了一个按字母顺序排列所有人口的国家的表格。这是怎么发生的?
在解释之后,有人可以通过正确查询的思考过程进行交谈吗? 感谢。
答案 0 :(得分:1)
SQL是关于查询的,即过滤和读/写。
当你这样做时:
SELECT country, MIN(population) AS min_pop FROM countries_by_population;
你打算选择人口最少的国家,而且逻辑是正确的 - "选择国家"和#34;人口最少"。然而,这里发生的是,一方面,"选择国家"没有过滤,意味着只读取数据,从过滤的元组中返回国家/地区"其中"条款(你没有)。另一方面,MIN()
返回最小值。基本上这里存在不匹配:您希望将具有最小人口的国家配对,但SQL不知道如何配对。
Group By表示具有相同值的组元组。在这种情况下,您只需按国家/地区分组,可能是名称,因为国家/地区是唯一的,因此它们不会超过两个。因此,基本上没有任何事情发生视觉。
select MIN(population) from countries_by_population
,
然后你可以做
select country from countries_by_population where population = minipop
,无论是在嵌套查询中,还是以不同的方式完成。
答案 1 :(得分:0)
GROUP BY要求在其中指定数学函数中指定的列。
示例:考虑员工表
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
答案 2 :(得分:0)
您需要GROUP BY
,但您可以做的是
SELECT TOP 1 country, MIN(population) AS min_pop
FROM countries_by_population
GROUP BY country
ORDER BY 2;
假设你正在使用MSSQL。