这是来自 SQL 标准的规则(该规则相当复杂,因为它涉及 SQL 用户可能不会考虑的许多细节)。
该规则背后有两个原则。首先,该标准不会强加操作的顺序,除非逻辑上有必要(ahaving
例如,子句必须在group by
)。这是 SQL is a 概念的基础描述性的语言,其中描述结果。任何特定的数据库引擎都可以确定自己的执行路径。
第二个原则是避免歧义。这就是作用域规则的用武之地,它定义了 SQL 编译器何时知道什么。
考虑以下陈述:
select a as b, b as a, a + 1 as d
-----------------------^
from t
问题是:哪个a
does a+1
参考专栏a
在表或列中b
(别名为a
) 在里面select
。根据标准,这是明确的。列别名在select
定义它们的子句。
这延伸到where
子句也是如此,它在相同的范围内进行评估。考虑同样的例子:
select a as b, b as a, a + 1 as d
from t
where a > 100
Which a
是否where
条件指的是?标准是明确的。这where
子句不理解中的列别名select
。这是因为select
在(逻辑上)评估之后where
。所以,当你说:
select row_number() over (order by a) as seqnum
from t
where a > 100
返回的值从第一个开始a
after100. 枚举不会首先发生,过滤的行获得被过滤掉的序列号。