查询关键字的执行顺序
约 419 字大约 1 分钟
2025-08-30
逻辑执行顺序
在 SQL 查询中,关键字的执行顺序遵循一个逻辑流程,该流程由数据库引擎(如 InnoDB)定义,但实际物理执行可能由优化器(Optimizer)根据统计信息、索引、查询类型等因素进行调整。优化器会重写查询计划以提高性能,但逻辑顺序始终是理解查询的基础。
以下是一个典型查询语句的执行顺序详解:
SELECT name, COUNT(*) AS employee_count
FROM employees
JOIN departments ON employees.department_id = departments.id
WHERE employees.salary > 50000
GROUP BY departments.name
HAVING COUNT(*) > 10
ORDER BY name
LIMIT 5;| 顺序 | 语句 | 作用 | 本例 |
|---|---|---|---|
| 1 | FROM | 识别数据来源的表。 | employees 和 departments |
| 2 | ON | 处理 JOIN 的关联条件,生成临时结果集。 | employees.department_id = departments.id |
| 3 | JOIN | 合并关联的表数据,形成中间结果集。 | 合并基于 ON 条件进行内连接 |
| 4 | WHERE | 对 JOIN 操作后的结果应用过滤条件,过滤掉不符合条件的行。 | employees.salary > 50000 |
| 5 | GROUP BY | 对 WHERE 过滤后的数据按指定字段分组,生成分组聚合结果。 | departments.name |
| 6 | HAVING | 筛选分组后的数据,仅保留满足条件的分组。 | COUNT(*) > 10 |
| 7 | SELECT | 选择需要返回的字段,并计算表达式或别名。 | name 和 COUNT(*) |
| 8 | DISTINCT | 去除重复的行(如果查询包含 DISTINCT 关键字)。 | - |
| 9 | ORDER BY | 对最终结果集排序。 | ORDER BY name |
| 10 | LIMIT | 限制返回的行数,这是查询的最后一步。 | LIMIT 5 |
上述顺序是逻辑上的,优化器可能调整物理执行(如重排序 WHERE 和 JOIN 以利用索引)。