在SQLZoo上,我找到了一个我不明白的问题的答案。问题是:
“按字母顺序列出每个大洲和国家名称。”
数据表:
答案是:
Select x.continent, x.name
From world x
Where x.name <= ALL (select y.name from world y where x.continent=y.continent)
ORDER BY name
如果我更改查询以使比较运算符为:“ ... x.name> = ALL(..”,而不是“” ... x.name <= ALL(...“),却给我提供了每个大陆上字母顺序最低的国家(例如津巴布韦代表非洲大陆),我不明白为什么它们会有不同的结果
所以我不明白,需要帮助的是:
a)为什么在处理这些字符串时允许使用此比较运算符?是因为这里的子查询实际上是布尔测试吗?
b)比比较本身多多少少会影响第二个查询中出现的国家/地区表的排序或搜索顺序?因为这是我认为这种行为正在发生的唯一方法
任何对增进我对此理解的帮助将不胜感激
答案 0 :(得分:1)
首先,它有助于理解这一点:
Where x.name <= ALL (select y.name from world y where x.continent=y.continent)
基本上等同于:
where x.name = (select min(y.name) from world y where x.continent=y.continent)
我认为这是更常用的(子查询中没有匹配项时会有区别)。
但是回到第一种形式。如果删除=
,则不会返回任何行:
Where x.name < ALL (select y.name from world y where x.continent=y.continent)
为什么?因为没有name
少于其大陆上的所有名称。这是一种重言式,因为name
本身位于非洲大陆,并且不小于其自身。
这可能使您了解正在发生的事情以及<=
与>=
不同的原因。对于>=
,您要查找的名称比所有名称(除了其本身)大 。那将是最大名称,而不是最小名称。