SQL 查询的逻辑处理顺序(即 SQL 引擎解析和执行查询的顺序)与书写顺序不同。以下是 SQL 查询的完整执行顺序:
1. 逻辑执行顺序
-
FROM 和 JOIN - 确定数据来源表并执行连接操作
-
WHERE - 对行进行筛选
-
GROUP BY - 将数据分组
-
HAVING - 对分组结果进行筛选
-
SELECT - 选择要返回的列
-
DISTINCT - 去除重复行
-
ORDER BY - 对结果排序
-
LIMIT/OFFSET - 限制返回的行数
2. 书写顺序对比
通常我们这样书写 SQL 查询:
SELECT DISTINCT column1, column2
FROM table1
JOIN table2 ON table1.id = table2.id
WHERE condition
GROUP BY column1
HAVING group_condition
ORDER BY column1
LIMIT 10;
3. 详细说明
-
FROM/JOIN:首先确定数据来源,包括所有表和它们的连接方式
-
WHERE:应用行级过滤条件,减少后续处理的数据量
-
GROUP BY:将数据按指定列分组
-
HAVING:过滤分组后的结果(与 WHERE 不同,WHERE 过滤行,HAVING 过滤组)
-
SELECT:此时才确定最终返回的列
-
DISTINCT:去除 SELECT 结果中的重复行
-
ORDER BY:对最终结果排序
-
LIMIT/OFFSET:限制返回结果的数量
4. 注意事项
-
这个顺序解释了为什么不能在 WHERE 子句中使用 SELECT 中定义的别名
-
聚合函数只能在 SELECT、HAVING 和 ORDER BY 子句中使用,不能在 WHERE 中使用
-
了解这个顺序有助于编写高效查询和解决复杂查询问题