当你觉得自己已经完全掌握 SELECT 查询时,是否真正理解过 SQL 中 SELECT 语句的执行顺序?

先来看一下 SELECT 语句的核心语法结构:
-- 选择要查询的列
SELECT [DISTINCT] column1, -- 去重选择列1
column2, -- 选择列2
aggregation_function(column3) AS alias_name, -- 聚合函数和别名
expression -- 或计算表达式
-- 指定数据来源
FROM table_name1 -- 从主表开始查询
-- 表连接(可选)
-- INNER JOIN table_name2 -- 内连接另一个表
-- LEFT JOIN table_name2 -- 左连接另一个表
-- ON table_name1.column = table_name2.column -- 连接条件
-- 过滤条件(可选)
-- WHERE condition -- 在分组前过滤行
-- 分组(可选)
-- GROUP BY column1, column2 -- 按指定列分组
-- 分组后过滤(可选)
-- HA VING condition -- 过滤分组后的结果
-- 排序(可选)
-- ORDER BY column1 ASC, -- 按列1升序排序
-- column2 DESC -- 按列2降序排序
-- 限制结果数量(可选)
-- LIMIT 10 -- 只返回10行
-- OFFSET 20 -- 从第21行开始返回那么,SELECT 查询的实际逻辑执行顺序如下表所示:
| 顺序 | 子句 | 核心作用 | 关键说明 |
|---|---|---|---|
| 1 | FROM | 确定查询的数据来源表 | 系统会先读取所有被指定的基础表。 |
| JOIN | 完成多表关联 | 根据 ON 条件把多张表关联起来,生成第一个中间结果集。 | |
| 2 | WHERE | 进行行级过滤 | 会对中间结果集逐行筛选。此时不能直接使用 SELECT 中定义的别名。 |
| 3 | GROUP BY | 执行分组 | 把符合条件的数据按指定字段分组,为后续聚合统计做准备。 |
| 4 | HA VING | 进行分组结果过滤 | 用于筛选分组后的结果。条件中通常会包含聚合函数。 |
| 5 | SELECT | 选择字段并完成计算 | 在这一步会计算表达式、执行聚合函数,并生成别名。 |
| 6 | DISTINCT | 结果去重 | 移除 SELECT 查询结果中的重复记录。 |
| 7 | ORDER BY | 结果排序 | 对最终输出结果进行排序。这里可以使用 SELECT 中定义的别名。 |
| 8 | LIMIT | 限制返回行数 | 只返回指定数量的数据记录,常用于分页查询。 |
从 SQL 逻辑执行顺序的角度来看,数据库引擎通常遵循标准流程,例如 FROM → WHERE → GROUP BY → HA VING → SELECT → ORDER BY。每一步都会基于上一步生成的中间结果继续处理,这些中间结果可以理解为“虚拟表”。这个模型非常适合理解 SELECT 查询语句的语法和语义,也是学习 SQL 执行顺序时最重要的思维框架。不过在真实的物理执行过程中,数据库查询优化器会根据成本评估生成更高效的执行计划。它可能会调整部分操作的实际执行方式,借助索引快速定位数据,并通过流水线处理等机制减少不必要的物理中间结果,从而显著提升查询性能。因此,“虚拟表”更适合帮助我们理解 SQL 的逻辑执行顺序,而优化器的执行计划,则是数据库实现高性能 SELECT 查询的关键保障。
