如果查询同时具有 group by 和 order by 子句,SQL 的执行顺序是什么。这是否取决于他们在查询中的位置???
8 回答
ORDER BY
总是在由 执行的分组的结果上执行GROUP BY
,即总是在“之后”。在标准 SQL 中,如果两者都存在,您必须在ORDER BY
词法上使用 afterGROUP BY
来“提醒您”这一事实。
为了:
FROM & JOIN确定和过滤行
WHERE行上的更多过滤器
GROUP BY将这些行组合成组
HAVING过滤器组
ORDER BY排列剩余的行/组
执行顺序不受任何 SQL 语句的强制。强制要求结果与“规范”评估获得的结果相匹配。在规范评估中,最后应用 ORDER BY(即使在评估 SELECT 列表表达式之后),但这并不意味着在实际系统上实际执行查询时排序会推迟到该点。
这取决于很多事情,包括您使用的 RDMS。找出正在发生的事情的最佳方法是使用查询工具,该工具允许您查看查询执行计划。
排序通常发生在最后。
如果您使用的是 SQL Server,则启动查询分析器和执行计划将为您提供一个很好的查询图形表示。
group by 首先执行,然后对组的结果进行排序。
假设我们有 SQL 查询:
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
SQL 查询子句的执行顺序为:
1. FROM clause
2. WHERE clause
3. GROUP BY clause
4. HAVING clause
5. SELECT clause
6. ORDER BY clause
我还将建议对特定的数据库引擎使用查询分析器。以下是 Postgres 中的一个示例,它解释了先执行 ORDER BY,然后执行 WHERE 过滤器:
EXPLAIN
SELECT * FROM table WHERE id=x AND date<='yyyy-mm-dd' ORDER BY date DESC;
因此,如果我将 DESC 更改为 ASC,结果集将包含不同的记录!