SQL:冗余WHERE子句指定列是> 0?

Ham*_*ter 5 sql database where-clause

帮助我理解这一点:在问题3a 的sqlzoo教程中("查找每个区域中最大的国家"),为什么将'AND population> 0'附加到嵌套的SELECT语句会使其正确?

OMG*_*ies 2

究其原因,是因为:

AND population > 0
Run Code Online (Sandbox Code Playgroud)

...正在过滤掉“欧洲”区域、名称“梵蒂冈”的空行,这使以下情况变得复杂:

WHERE population >= ALL (SELECT population 
                           FROM ...)
Run Code Online (Sandbox Code Playgroud)

...因为 NULL 不是一个值,所以俄罗斯不会被正确排名。ALL 运算符要求您比较的值大于或等于从子查询返回的所有值,当其中存在 NULL 时,这种情况永远不会发生。

我的查询是:

SELECT region, name, population 
  FROM bbc x
 WHERE population = (SELECT MAX(population)
                       FROM bbc y
                      WHERE y.region = x.region)
Run Code Online (Sandbox Code Playgroud)

...或者,使用 JOIN:

SELECT x.region, x.name, x.population 
  FROM bbc x 
  JOIN (SELECT y.region, 
               MAX(y.population) AS max_pop
          FROM bbc y 
      GROUP BY y.region) z ON z.region = x.region 
                          AND z.max_pop = x.population
Run Code Online (Sandbox Code Playgroud)

  • @Hamster:是的,你可以将“population > 0”更改为“population IS NOT NULL” (3认同)