当sql中有MAX函数时,所有函数都是冗余的吗?

当sql中有MAX函数时,所有函数都是冗余的吗?,sql,Sql,我现在正在sqlzoo上练习sql。 我突然想到,既然MAX函数只输出一个值,为什么当我们得到MAX函数时,我们需要所有的函数呢 当我们排除ALL函数时,会导致什么不同 SELECT name FROM bbc WHERE population > ALL (SELECT MAX(population) FROM bbc WHERE region = 'Europe') AND region = 'South Asia' 仅当

我现在正在sqlzoo上练习sql。 我突然想到,既然MAX函数只输出一个值,为什么当我们得到MAX函数时,我们需要所有的函数呢

当我们排除ALL函数时,会导致什么不同

SELECT name FROM bbc
 WHERE population > ALL
       (SELECT MAX(population)
          FROM bbc
         WHERE region = 'Europe')
   AND region = 'South Asia'


仅当结果包含多行时,才需要All运算符。当结果出现在单行中时,此时使用max关键字或top 1“ALL”运算符不是必需的。

这些表达式:

WHERE population > ALL (SELECT population
                        FROM bbc
                        WHERE bbc.region = 'Europe'
                       )
以及:

几乎完全一样。当
WHERE
子句过滤掉所有行时,就会出现差异。在这种情况下,
population>ALL(…)
的计算结果为true。但是,
population>(选择MAX()…)
不会

原因是
NULL
值。如果没有匹配项,则
MAX()
计算结果为
NULL


同样的逻辑应该适用于你的情况。如果
WHERE
过滤掉所有行,则
MAX()
返回
NULL
。由于
NULL
,因此
ALL
的计算结果将不会为
true
。但是,如果省略
ALL
,它应该返回所有行。

首先,
ALL
不是一个函数,而是一个运算符

其次,您的查询应该根据预期结果进行更改(这涉及到SQL中的
NULL
问题)

如果您需要返回一些行,即使子查询没有返回行(在这种情况下,即没有地区
'Europe'
),那么您应该使用
ALL
NOT EXISTS

SELECT name FROM bbc
WHERE population > ALL (
        SELECT population
        FROM bbc
        WHERE region = 'Europe')
    AND region = 'South Asia;
(假设在
地区=“南亚”
有一些名字)

如果希望不返回行,如果子查询不返回行,则应使用

SELECT name FROM bbc
WHERE population > (
        SELECT MAX(population)
        FROM bbc
        WHERE region = 'Europe'
    )
    AND region = 'South Asia;

我认为您应该重写查询,这不会生成行:

select * from generate_series(1,10) x
where x > all(select max(t) from generate_series(1,5) t where t = 100);

这也是:

select * from generate_series(1,10) y
where y > (select max(t) from generate_series(1,5) t where t = 100);

下面可能是您想要的查询。也就是说,它将显示人口超过所有欧洲国家人口的国家;如果欧洲没有更多的国家(其中region='europe'不产生任何行,因此可以将其视为零人口),您需要显示那些人口大于欧洲零人口的国家,请改用此选项:
field>all(选择另一个_字段

select * from generate_series(1,10) z
where z > all(select t from generate_series(1,5) t where t = 100)
ALL不是冗余的。
字段>(选择MAX(
)可能不会产生所需的结果。此外,ALL具有更好的语义

但是,在您的问题的查询中,“全部”是多余的,因为您使用的是“最大值”。大多数情况下,“全部”并不打算与“最大值”
field>ALL一起使用(选择另一个字段即可)

select * from generate_series(1,10) z
where z > all(select t from generate_series(1,5) t where t = 100)