SELECT
在 ISO/IEC 标准 SQL 中,为子句规定了以下句法顺序:
SELECT
projection-expressions
FROM
sources
WHERE
predicate-expression
GROUP BY
key-expression
HAVING
predicate-expression
ORDER BY
ordering-expressions
虽然逻辑执行顺序是这样的:
FROM
sources
WHERE
predicate-expression
GROUP BY
value-expression
HAVING
value-expression
SELECT
projection-expressions
ORDER BY
ordering-expressions
对于 SQL 的新手来说,子句中定义的投影在or子句SELECT
中不可用是令人惊讶的,即使它是首先声明的 - 考虑到计算机程序通常遵循自上而下的执行顺序。WHERE
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 中,等效项是:
source // FROM equivalent
.Where( predicate-expression )
.GroupBy( key-expression )
.Where( predicate-expression ) // HAVING equivalent
.Select( projection-expression )
.OrderBy( ordering-expression )
(我也喜欢 Linq 如何让您Select()
在命令序列中的任何位置添加投影,这样您就可以使用已计算的表达式而无需再次调用表达式)。
那么,是否有任何 SQL 实现可以让您以更合乎逻辑的结构表达查询?
不,SQL 是标准化的。标准的实现没有太大差异。这种做法违背了目的。关系演算(SQL 假装是)与关系代数方法之间存在/一直存在着争论。这是一场古老的辩论,
而且,再次来自科德本人,
这两种方法肯定有大量的实现。也就是说,SQL 作为一种实现非常固定在微积分方法上。
LINQ问题
这些问题从未真正随着代数方法而消失,例如来自这个博客,。
需要手动优化,因为,
如果您有多个具有不同性能特征(索引,其中大部分以间接和抽象方式实现)和统计信息的不同关系,则很难编写有效工作的过程集逻辑。