我在理解一个相当基本的概念时遇到了麻烦。感谢任何人的帮助!我从这样的资源中了解到,SQL操作的处理顺序是:
1) from 2)其中3) group by 4)具有5)选择6) order by 7) limit
然而,当我看到下面这个取自DataCamp的查询时,我感到困惑。如果SQL在SELECT之前处理GROUP BY,那么如何在GROUP BY子句中使用在SELECT语句(home_team)中创建的字段?
谢谢!
-- Identify the home team as Bayern Munich, Schalke 04, or neither
SELECT
CASE WHEN hometeam_id = 10189 THEN 'FC Schalke 04'
WHEN hometeam_id = 9823 THEN 'FC Bayern Munich'
ELSE 'Other' END AS home_team,
COUNT(id) AS total_matches
FROM matches_germany
-- Group by the CASE statement alias
GROUP BY home_team;
发布于 2019-04-15 02:43:56
您的特定查询具有:
GROUP BY hometeam_id
---------^
这是原始数据中的列,而不是SELECT
中的列。数据在hometeam_id
级别聚合。然后在聚合之后应用CASE
表达式。
您的问题假设查询是使用以下命令编写的:
GROUP BY home_team
这可能会工作,也可能不会工作,这取决于数据库。
SQL没有“处理顺序”。SQL引擎分析查询并开发一个表示需要对数据执行的操作的有向无环图(DAG)。
您正在考虑的是SQL中标识符的作用域规则。最大的问题是在哪里可以使用在SELECT
中定义的别名。
基本上没有数据库允许在以下子句中使用列别名:
SELECT
FROM
WHERE
所有数据库都允许在以下子句中使用列别名:
ORDER BY
.某些数据库允许在GROUP BY
和HAVING
子句中使用列别名。
您的数据库似乎是允许在GROUP BY
中这样使用的数据库。
https://stackoverflow.com/questions/55678736
复制相似问题