SQL: 重复的WHERE子句指定列> 0?

5

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

2个回答

2
原因是因为:
AND population > 0

...正在过滤区域为“欧洲”、名称为“梵蒂冈”的空行,这使得问题更加复杂:

WHERE population >= ALL (SELECT population 
                           FROM ...)

由于NULL不是一个值,所以俄罗斯将无法正确排名。ALL运算符要求您比较的值大于或等于子查询返回的所有值,当其中存在NULL时,这是不可能发生的。

我的查询应该是:

SELECT region, name, population 
  FROM bbc x
 WHERE population = (SELECT MAX(population)
                       FROM bbc y
                      WHERE y.region = x.region)

...或者,使用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

哦,所以欧洲是唯一一个人口值为NULL的地区。我明白了。 - Hamster
@Hamster:是的,否则你会看到其他区域也退出。ALL运算符要求你比较的值大于或等于子查询返回的所有值,当其中有NULL时,这是不可能发生的。 - OMG Ponies
还有一个 NOT NULL 选项吗?这样可能更有意义。 - Hamster
3
可以将population > 0更改为population不为空 - OMG Ponies

0

不是这样的。最大的国家先验地有非零人口。

这就像检查最大的书是否有任何页面。


1
我认为这就是@Hamster问题的重点 - 在SQLzoo网站上给出的例子中,该子句的一部分就在其中。 - sasfrog
如果省略“> 0”子句,查询结果也会有所不同。 - Alex Reitbort
是的,俄罗斯好像不见了。我不明白为什么会发生这种情况。 - Hamster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接