sql数据库基础

281 阅读2分钟

sql执行顺序

在 SQL 查询中,分页(LIMIT 和 OFFSET)分组(GROUP BY) 的执行顺序取决于数据库的具体实现。

一般来说,分组操作会在分页之前执行,即先对数据进行分组,然后再应用分页。

这意味着,分页操作是在分组后的结果集上进行的

执行顺序概述:

  1. FROM:确定查询的数据源。

  2. JOIN:如果有连接操作,执行连接。

  3. WHERE:对数据进行筛选。

  4. GROUP BY:对筛选后的数据进行分组。

  5. HAVING:对分组后的数据进行筛选。

  6. SELECT:选择需要的字段。

  7. ORDER BY:对结果进行排序。

  8. LIMIT/OFFSET:对排序后的结果进行分页。

示例:

假设有一个订单表 Orders,包含字段 id、status 和 amount,你希望查询每个状态的订单数量,并对结果进行分页。

SELECT status, COUNT(*) AS orderCount
FROM Orders
GROUP BY status
ORDER BY orderCount DESC
LIMIT 10 OFFSET 0;

执行顺序:

  1. FROM:从 Orders 表获取数据。

  2. GROUP BY:根据 status 字段对数据进行分组。

  3. SELECT:选择 status 和每个状态的订单数量。

  4. ORDER BY:根据 orderCount 对结果进行降序排序。

  5. LIMIT/OFFSET:获取前 10 条记录。

注意事项:

性能考虑:在大型数据集上,先分组再分页可能导致性能问题。

数据库差异:不同的数据库系统可能在分页和分组的执行顺序上有所差异,建议查阅相关数据库的文档以获取准确的信息。


✅ SQL 的真实执行顺序(逻辑执行阶段)如下:

执行顺序SQL 子句说明
1️⃣FROM确定数据源(表、子查询)
2️⃣JOIN处理连接
3️⃣WHERE过滤行(只对原始行生效)
4️⃣GROUP BY分组
5️⃣HAVING过滤分组结果
6️⃣WINDOW窗口函数执行阶段 ✅
7️⃣SELECT选择列(此时可以使用窗口函数结果)
8️⃣ORDER BY对结果排序
9️⃣LIMIT/OFFSET分页限制输出行数

这解释了两个重要现象:

场景原因
不能在 WHERE 中用窗口函数因为 WHERE 是在窗口函数之前执行
可以在 SELECT 中用窗口函数因为 WINDOW 比 SELECT 先执行
如果要筛选窗口函数结果,需用子查询因为 WINDOW 不影响 WHERE 和 HAVING

✅ 记忆小技巧:

“F-W-G-H-WIN-S-O-L”****

FROM → WHERE → GROUP BY → HAVING → WINDOW → SELECT → ORDER BY → LIMIT

参考资料:

MySQL中ORDER BY 与LIMIT 的执行顺序

图解SQL 执行顺序,通俗易懂!