当sql中有MAX函数时,所有函数都是冗余的吗?
我现在正在sqlzoo上练习sql。 我突然想到,既然MAX函数只输出一个值,为什么当我们得到MAX函数时,我们需要所有的函数呢 当我们排除ALL函数时,会导致什么不同当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' 仅当
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)