SQL比较=all(布尔结果)不同的结果

SQL比较=all(布尔结果)不同的结果,sql,Sql,在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、 名称>=全部..,而不是,。。。

在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、 名称>=全部..,而不是,。。。x、 名称首先,它有助于理解:

 Where x.name <= ALL (select 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)
为什么??因为没有名字比他们大陆上所有的名字都少。这是一个同义反复,因为这个名字本身就在这个大陆上,而且它并不比它自己小


这可能会让你一瞥正在发生的事情以及原因=。对于>=您正在寻找一个比除自身以外的所有名称都大的名称。这将是最大的名称,而不是最小的名称。

这确实非常简单。在一种情况下,您要查找的名称小于或等于当前行中的名称。例如,在欧洲,安道尔不低于也不等于阿尔巴尼亚,所以这一排不符合资格。另一方面,阿尔巴尼亚比安道尔小,与阿尔巴尼相等,因此这是预期的答案。在>=的情况下,逻辑是相同的,但这次您将按字母顺序查找最后一个逻辑。顺便说一句,除了抽样之外,没有人会用它来查询每个大陆的最小或最大国家。谢谢你回答戈登,这开始让我们了解这里发生了什么,但当我用>=运行它时,我实际上得到的是按字母顺序排列的大陆最低的国家,比如津巴布韦,而不是名称的大小,所以我觉得还有很多事情要做this@Georgec . . . 津巴布韦是非洲大陆字母顺序中最高的,而不是最低的。这一切都有道理。比较是基于字符串比较,而不是长度。啊,对不起,我误解了你的意思,这很好地解释了最后一个问题,完全解决了这个问题。谢谢戈登
 Where x.name < ALL (select y.name from world y where x.continent=y.continent)