为什么SQL中的标识符可以在赋值前被引用?

Why can identifiers in SQL be referenced before assignment?

在 SQL 查询中,您可以在声明名称之前引用该名称。

SELECT A.id FROM table_a A;

此行为的历史是什么?它与要求您在引用变量之前先赋值给变量的编程语言有何关系?

您误解了 SQL 语言的本质。它不是过程性语言,而是声明性语言。该语句描述了结果应该是什么样子,数据库相应地构建了实际的查询计划——默认情况下,您看不到。

一些数据库提供某种程序sub-language,可用于编写程序-例如Oracle 中的PL/SQL。但是,您在此处显示的是标准 SQL SELECT 语句。那里没有变量声明的概念。 FROM 子句中的 Atable_a 的别名,也称为标识符,您可以使用它来引用 table 的列,使用 <table identifier>.<column name>.

Why can identifiers in SQL be referenced before assignment?

它是 table 的别名。但这里的关键点是 SQL 不应该读作 top-down.

SELECT A.id 
FROM table_a A;

实际执行起来更像:

FROM table_a A
SELECT A.id;

现在完全有道理了。


更进一步:

SELECT A.id + 1 AS c 
FROM table_a A
WHERE c = 10;
-- error, we cannot use c, even if it was defined 2 lines before

因为顺序如下:

FROM table_a A
WHERE c = 10       -- here C is not defined
SELECT A.id + 1 c;

即使在 SELECT 中的同一级别,也无法重用已定义的别名:

 SELECT a + 1 AS b, b + 1 AS c, c + 1 AS d
 FROM tab
 -- error
 -- (some databases allow to use lateral column aliasing)

相关阅读:

Lexical and logical SELECT clause order