我有一张桌子"国家"与columns -> name,continent,area,popualtion.
我们想说我想找到人口最多的name
population
和country
。
SELECT MAX(population) FROM countries;
上面的示例返回最大人口。 我希望它也能看到该人口的国家名称。
SELECT name,MAX(population) FROM countries;
我收到如下错误。
错误:列" countries.name"必须出现在GROUP BY子句中或用于聚合函数
我无法想到另一种方法。 以下是我的查询示例。
SELECT name,population
FROM countries
WHERE population >= (
SELECT MAX(population)
FROM countries)
;
此查询有效,但我也很好奇为什么我会收到错误或者是否有人知道是否有更好的方法可以实现此目的?
答案 0 :(得分:1)
https://sitename/wp-content/uploads/2017/09/59a778097ae6e.jpeg
答案 1 :(得分:0)
MAX
从值列表中选择最大元素。在您的第一个查询中,
SELECT MAX(population) FROM countries;
通过从population
中的所有行中提取countries
字段来形成列表,然后选择最大值。这会将行列表折叠为仅包含最大行的单行。
在第二个查询中,
SELECT name,MAX(population) FROM countries;
您(从概念上)获取name
中所有countries
字段的列表,但只有一个MAX(population)
。数据库系统不知道该怎么做:SELECT name FROM countries
将返回countries
中的行数,但SELECT MAX(population) FROM countries
只返回一行。这不匹配;目前还不清楚你想从中返回多少行。这就是您收到错误的原因。
错误消息显示您需要
name
,这会将行列表折叠为单个值,可以沿单个MAX
值返回,或者GROUP BY name
子句,该子句将国家/地区列表分组为具有相同名称的条目,然后分别为每个组计算MAX(population)
。如果您所有的国家/地区都有不同的名称,这是没有意义的。据我所知,"没有SQL语法;选择最大population
,然后从同一行获取name
字段" (目前还不太清楚这会做什么,因为可能有多个population
等于最大值的国家/地区。
您可以做的是对整个表进行排序,然后仅选择第一行中的字段:
SELECT name, population
FROM countries
ORDER BY population DESC
LIMIT 1
(我很确定Postgres对此进行了优化,因此没有实际的排序。)
现在,如果有多个国家/地区拥有最多人口,您将获得一个随机结果(我们没有告诉数据库如何对具有相同人口的行进行排序)。
答案 2 :(得分:-1)
您可以使用Top关键字仅选择单个记录 来自国家表。
SELECT Top 1 name,population,Country
FROM countries
order by population DESC