为什么在分配之前可以在SQL中引用标识符?

问题描述

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

SELECT A.id FROM table_a A;

这种行为的历史是什么?它与要求您在引用变量之前先分配变量的编程语言有什么关系?

解决方法

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

某些数据库提供了某种过程子语言,可用于编写过程-例如Oracle中的PL / SQL。但是,您在此处显示的是标准SQL SELECT语句。那里没有变量声明的概念。 A子句中的FROMtable_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?

Lexical and logical SELECT clause order

All-at-once rule