在SQL中,据我所知,逻辑查询处理顺序,也就是概念解释顺序,以FROM开头的方式如下:
按照这个列表很容易看出为什么 WHERE 子句中不能有 SELECT 别名,因为别名还没有被创建。T-SQL (SQL Server) 严格遵循这一点,在通过 SELECT 之前不能使用 SELECT 别名。
但是在 MySQL 中,可以在 HAVING 子句中使用 SELECT 别名,即使它应该(逻辑上)在 SELECT 子句之前处理。这怎么可能?
举个例子:
SELECT YEAR(orderdate), COUNT(*) as Amount
FROM Sales.Orders
GROUP BY YEAR(orderdate)
HAVING Amount>1;
Run Code Online (Sandbox Code Playgroud)
该语句在 T-SQL 中无效(因为 HAVING 指的是 SELECT 别名Amount
)...
Msg 207, Level 16, State 1, Line 5
Invalid column name 'Amount'.
Run Code Online (Sandbox Code Playgroud)
...但在 MySQL 中工作得很好。
基于此,我想知道: