SELECT
在 ISO/IEC 标准中,SQL 为子条款规定了以下语法顺序:
SELECT
projection-expressions
FROM
sources
WHERE
predicate-expression
GROUP BY
key-expression
HAVING
predicate-expression
ORDER BY
ordering-expressions
Run Code Online (Sandbox Code Playgroud)
虽然逻辑执行顺序是这样的:
FROM
sources
WHERE
predicate-expression
GROUP BY
value-expression
HAVING
value-expression
SELECT
projection-expressions
ORDER BY
ordering-expressions
Run Code Online (Sandbox Code Playgroud)
对于 SQL 的新手用户来说,即使它是首先声明的,在SELECT
子句中定义的投影在WHERE
or子句中不可用,这变得令人惊讶GROUP BY
- 考虑到计算机程序通常遵循自上而下的执行顺序。
同样令人惊讶的是,SQL 作者需要在、 和子句中重复他们的表达式SELECT
,或者使用不适合简洁查询的子查询。至少当用户熟悉实际的子句执行顺序时,他们知道为什么需要重复自己,但这并不能阻止它令人沮丧。WHERE
GROUP BY
这个问题和其他相关问题记录在我发现的这篇文章中:https : //blog.jooq.org/a-beginners-guide-to-the-true-order-of-sql-operations/,这并不奇怪StackOverflow 上的 QA 有近 30,000 次查看:https : //stackoverflow.com/questions/3241352/using-an-alias-column-in-the-where-clause-in-postgresql
这让我想知道是否有任何 SQL 实现允许这种更“合乎逻辑”的子句排序。我注意到 .NET 中的 Linq 实际上确实遵循这个顺序,虽然我不会将它描述为真正的 SQL 实现,但实际上,在 Linq …
syntax ×1