为什么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
子句中的 A
是 table_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
在 SQL 查询中,您可以在声明名称之前引用该名称。
SELECT A.id FROM table_a A;
此行为的历史是什么?它与要求您在引用变量之前先赋值给变量的编程语言有何关系?
您误解了 SQL 语言的本质。它不是过程性语言,而是声明性语言。该语句描述了结果应该是什么样子,数据库相应地构建了实际的查询计划——默认情况下,您看不到。
一些数据库提供某种程序sub-language,可用于编写程序-例如Oracle 中的PL/SQL。但是,您在此处显示的是标准 SQL SELECT
语句。那里没有变量声明的概念。 FROM
子句中的 A
是 table_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