1、SQL语句执行顺序
SQL 语句的书写顺序和实际执行顺序是不同的。
书写顺序
SELECT FROM WHERE GROUP BY HAVING ORDER BY LIMIT / OFFSET
逻辑执行顺序:
确定查询的数据源(表、视图、子查询等)。FROM :ON(如果涉及JOIN):应用连接条件(如INNER JOIN ... ON a.id = b.id)。JOIN对连接后的结果集 进行行级过滤。不能使用WHERE:SELECT中定义的别名(因为SELECT还没执行!)将GROUP BY:WHERE过滤后的数据按指定列分组。对 分组后的结果 进行过滤。可以使用聚合函数(如HAVING:COUNT(),SUM())。计算并选择要返回的列。此时才定义列别名(如SELECT:salary * 12 AS annual)。去除重复行(在DISTINCT:SELECT之后)。对最终结果集排序。可以使用ORDER BY:SELECT中的列别名(因为SELECT已执行)LIMIT/OFFSET/限制返回的行数(如分页)。在排序后应用。FETCH:
| 子句 | 是否能用聚合函数? | 是否能用 SELECT 别名? | 作用对象 |
|---|---|---|---|
WHERE |
❌ | ❌ | 原始行 |
GROUP BY |
❌(但可分组列) | ❌ | 分组依据 |
HAVING |
✅ | ❌(但可用聚合结果) | 分组后的行 |
SELECT |
✅ | — | 定义输出列 |
ORDER BY |
✅ | ✅ | 最终结果集 |
LIMIT |
❌ | ✅ | 排序后的结果 |