gpt4 book ai didi

sql - WHERE 子句中的逻辑处理顺序或 SQL 标准

转载 作者:行者123 更新时间:2023-11-29 12:46:04 25 4
gpt4 key购买 nike

几天前有人问我关于 SELECT 语句的逻辑处理顺序,更具体地说是关于别名和 where 子句的问题,我不确定一个问题。如果我们有这样的查询:

SELECT name AS first_name
FROM people
WHERE first_name = 'Alan';

之所以在WHERE子句中使用别名会产生错误,实际上是SELECT语句的逻辑处理顺序,或者语法解析问题,或者是SQL标准的规则?

最佳答案

这是来自 SQL 标准的规则(它相当复杂,因为它涉及到很多 SQL 用户可能不会考虑的细节)。

该规则背后有两个原则。首先是该标准不强加操作顺序,除非逻辑上有必要(例如,having 子句必须在 group by 之后进行逻辑处理)。这是概念的基础,SQL 是一种描述性 语言,其中描述了结果。任何特定的数据库引擎都可以确定自己的执行路径。

第二个原则是避免歧义。这就是作用域规则的用武之地,它定义了 SQL 编译器何时知道什么。

考虑以下语句:

select a as b, b as a, a + 1 as d
-----------------------^
from t

问题是:a+1指的是哪个a,表中的a列还是b列(别名为 a)在 select 中。根据标准,这是明确的。列别名在定义它们的 select 子句中是未知的。

这也扩展到 where 子句,它在相同的范围内进行评估。考虑相同的例子:

select a as b, b as a, a + 1 as d
from t
where a > 100

where条件指的是哪个a?标准是明确的。 where 子句不理解 select 中的列别名。这是因为 select 是在 where 之后(逻辑上)求值的。所以,当你说:

select row_number() over (order by a) as seqnum
from t
where a > 100

返回的值从第一个 a after 100 开始。枚举不会首先发生,过滤的行获得被过滤掉的序列号。

关于sql - WHERE 子句中的逻辑处理顺序或 SQL 标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21905893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com