如何select人口最少的国家
How to select the country with the min population
我知道这是一个非常简单的问题,但我需要有人来解释这个查询背后的思考过程。
我有大量 table 与国家相关的数据。我想看看哪个国家的人口最少,所以我使用以下查询
SELECT country, MIN(population) AS min_pop FROM countries_by_population;
return该国家/地区应该在聚合或 GROUP BY 中是一个错误。我很困惑;为什么?这个查询不应该只看到带有国家名称的 min(population) 和 return 吗?
之后,我将国家/地区添加到 GROUP BY 中,就像这样
SELECT country, MIN(population) AS min_pop FROM countries_by_population GROUP BY country;
我得到了所有国家/地区的 table,其人口按字母顺序排列。这是怎么发生的?
在解释完这个之后,有人可以谈谈正确查询的思考过程吗?
谢谢
GROUP BY需要在数学函数中指定的列在其中指定。
示例:考虑 员工 table
SELECT NAME, SUM(SALARY) FROM CUSTOMERS
GROUP BY NAME;
这将 return 类似这样的结果
+----------+-------------+
| 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
您将需要 GROUP BY
但您可以做的是
SELECT TOP 1 country, MIN(population) AS min_pop
FROM countries_by_population
GROUP BY country
ORDER BY 2;
假设您使用的是 MSSQL。
SQL是关于查询,即过滤和read/write。
当你这样做时:
SELECT country, MIN(population) AS min_pop FROM countries_by_population;
您打算 select 人口最少的国家,这个逻辑是正确的--"select countries" 和 "with the minimum population"。然而,这里发生的事情是,一方面,"select countries" 没有过滤,意味着只读取数据,从潜在的 "where" 子句(你没有)过滤的元组中返回国家).另一方面,MIN()
returns 最小值。基本上这里存在不匹配:您想将人口最少的国家配对,但 SQL 不知道如何。
Group By 表示对具有相同值的元组进行分组。在这种情况下,您只需按国家/地区及其名称进行分组,并且由于国家/地区是独一无二的,因此它们不会超过两个。因此基本上什么都没有发生 visually.
- 有几种方法可以完成您的任务,其中之一是您可以首先使用
查询最小人口的值
select MIN(population) from countries_by_population
、
那么你可以
select country from countries_by_population where population = minipop
,可以在嵌套查询中进行,也可以通过单独的方式进行。
我知道这是一个非常简单的问题,但我需要有人来解释这个查询背后的思考过程。 我有大量 table 与国家相关的数据。我想看看哪个国家的人口最少,所以我使用以下查询
SELECT country, MIN(population) AS min_pop FROM countries_by_population;
return该国家/地区应该在聚合或 GROUP BY 中是一个错误。我很困惑;为什么?这个查询不应该只看到带有国家名称的 min(population) 和 return 吗?
之后,我将国家/地区添加到 GROUP BY 中,就像这样
SELECT country, MIN(population) AS min_pop FROM countries_by_population GROUP BY country;
我得到了所有国家/地区的 table,其人口按字母顺序排列。这是怎么发生的?
在解释完这个之后,有人可以谈谈正确查询的思考过程吗? 谢谢
GROUP BY需要在数学函数中指定的列在其中指定。
示例:考虑 员工 table
SELECT NAME, SUM(SALARY) FROM CUSTOMERS
GROUP BY NAME;
这将 return 类似这样的结果
+----------+-------------+
| 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
您将需要 GROUP BY
但您可以做的是
SELECT TOP 1 country, MIN(population) AS min_pop
FROM countries_by_population
GROUP BY country
ORDER BY 2;
假设您使用的是 MSSQL。
SQL是关于查询,即过滤和read/write。
当你这样做时:
SELECT country, MIN(population) AS min_pop FROM countries_by_population;
您打算 select 人口最少的国家,这个逻辑是正确的--"select countries" 和 "with the minimum population"。然而,这里发生的事情是,一方面,"select countries" 没有过滤,意味着只读取数据,从潜在的 "where" 子句(你没有)过滤的元组中返回国家).另一方面,MIN()
returns 最小值。基本上这里存在不匹配:您想将人口最少的国家配对,但 SQL 不知道如何。Group By 表示对具有相同值的元组进行分组。在这种情况下,您只需按国家/地区及其名称进行分组,并且由于国家/地区是独一无二的,因此它们不会超过两个。因此基本上什么都没有发生 visually.
- 有几种方法可以完成您的任务,其中之一是您可以首先使用 查询最小人口的值
select MIN(population) from countries_by_population
、
那么你可以
select country from countries_by_population where population = minipop
,可以在嵌套查询中进行,也可以通过单独的方式进行。