SQL 在 PostgreSQL 中使用 ALL 进行查询的意外结果

Unexpected result of SQL query with ALL in PostgreSQL

我有一个非常简单的 table countries(name, gdp, continent),其中包含我从维基百科收集的数据(实际上,并不重要)。如果我想知道每个大陆有多少个国家

SELECT continent, COUNT(*) AS cnt
FROM countries
GROUP BY continent;

我得到以下结果:

   continent   | cnt 
---------------+-----
 Africa        |  56
 Asia          |  46
 South America |  12
 North America |  22
 Europe        |  46
 Oceania       |  14

所以我有每个内容对应的国家。无论如何,只有196行,所以数据很小。

不,我想使用查询来获取每个大洲的 GDP 最高的国家/地区。查询也很简单,如下所示:

SELECT name, continent, gdp
FROM countries c1
WHERE gdp >= ALL (SELECT gdp 
                  FROM countries c2 
                  WHERE c2.continent = c1.continent);

然而,我得到的结果是:

            name            |   continent   |      gdp       
----------------------------+---------------+----------------
 Australia                  | Oceania       |  1748000000000
 Brazil                     | South America |  1810000000000
 People's Republic of China | Asia          | 19910000000000
 United States              | North America | 25350000000000

简而言之,缺少EuropeAfrica对应的国家。从数据上看,GDP最高的国家是德国,但不明白为什么不在结果集中。

作为测试,如果我运行查询

SELECT continent, MAX(GDP) AS max_gdp
FROM countries
GROUP BY continent;

我正确地得到了每个大陆的 6 个 GDP 值(包括德国的正确值):

   continent   |    max_gdp     
---------------+----------------
 Africa        |   498060000000
 Asia          | 19910000000000
 South America |  1810000000000
 North America | 25350000000000
 Europe        |  4319000000000
 Oceania       |  1748000000000

为什么 ALL 查询缺少欧洲和非洲国家的 2 行?

问题原来是 NULL 值,正如 a_horse_with_no_name 所怀疑的那样。

请注意,在 PostgreSQL 中有一种更高效的方法来编写此查询:

SELECT DISTINCT ON (continent)
       name, continent, gdp
FROM countries
ORDER BY continent, gdp DESC NULLS LAST;

对于每个大洲,这将按 ORDER BY 顺序输出第一行。