我对使用来自sqlzoo的嵌套SELECT测验 ALL.In 有点困惑(链接在这里:)
Q1:选择显示每个区域中最小国家/地区的名称,区域和人口的代码
SELECT region, name, population FROM bbc x WHERE population <= ALL (SELECT
population FROM bbc y WHERE y.region=x.region AND population>0)
我认为这对我来说是有道理的,因为我们试图获得小于每个地区最小国家的人口(首先使用内部子查询查询)。
但随后,Q2 出现了:选择显示属于所有人口超过 50000 的地区的国家/地区的代码
然后代码是:
SELECT name,region,population FROM bbc x WHERE 50000 < ALL (SELECT population
FROM bbc y WHERE x.region=y.region AND y.population>0)
如果我们试图得到人口> 50000 的国家,为什么标志不是>而是<?
我觉得我在某个地方缺少了一个基本的理解,但我什至不确定在哪里。
如果可以这样写,它会更具可读性和更容易理解:
WHERE ALL (SELECT population....) > 50000
但这在语法上是错误的。
从 https://oracle-base.com/articles/misc/all-any-some-comparison-conditions-in-sql
ALL 比较条件用于将值与列表或 子查询。
它前面必须有 =、!=、>、<、<=、>= 和 后跟列表或子查询。
也来自 https://learn.microsoft.com/en-us/sql/t-sql/language-elements/all-transact-sql?view=sql-server-2017
语法应为:
scalar_expression { = | <> | != |> |>= | !> | <|<= | !<} ALL (子查询)
所以你不能避免在比较的右侧有ALL
子句,
但这都是一样的,因为50000
必须小于子查询中的每个项目。
对于第一个问题,population
是第一个问题,因此当您查询"<=(小于或等于)所有总体的总体"时,这意味着它是最小的一个。
在第二个问题中,50000在比较中排在第一位。
"超过 50000的人口"也意味着这些人口中有 50000 <,这正是它在查询中所说的。