问题描述
SELECT A.id FROM table_a A;
这种行为的历史是什么?它与要求您在引用变量之前先分配变量的编程语言有什么关系?
解决方法
您误解了SQL语言的性质。它不是程序语言,而是声明性语言。该语句描述了结果的样子,数据库相应地构建了实际的查询计划-默认情况下,您看不到它。
某些数据库提供了某种过程子语言,可用于编写过程-例如Oracle中的PL / SQL。但是,您在此处显示的是标准SQL SELECT
语句。那里没有变量声明的概念。 A
子句中的FROM
是table_a
的别名,又名标识符,您可以使用<table identifier>.<column name>
这样的表达式来引用表的列。
为什么在分配之前可以引用SQL中的标识符?
它是表的别名。但是这里的关键是不要从上至下阅读SQL。
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)
相关阅读:
Why do “linq to sql” queries starts with the FROM keyword unlike regular SQL queries?