一文搞懂SQL执行顺序

结论: SQL执行顺序为FROM & JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT。

1 . FROM & JOIN:首先解析FROM,确定查询表。
通过 JOIN,您可以连接表以形成初步数据集。
2 . 位置:过滤您的初步数据集并仅保留符合您标准的记录。
3 . GROUP BY:通过按特定列对数据进行分组来准备聚合函数。
4 、HAVING:过滤分组数据,支持类似于WHERE但分组后使用的聚合函数。
5 . SELECT:指定查询列或表达式并向聚合函数添加新字段。
6 . DISTINCT:删除重复的查询结果。
7 . ORDER BY:默认按照升序对结果进行排序,可以使用DESC进行降序排序。
8 . LIMIT:限制结果行数,常与ORDER BY一起使用。

示例:
FROMEmployees JOIN Department ONEmployees.dept_id=department.idWHEREemployees.salary>5 000GROUP BYdepartment.idHAVINGCOUNT()>5 SELECTDepartment.id,COUNT()asEmployee_count,DISTINCTDepartment.idORDERBYsalaryDESCLIMIT1 0
通过这种方式,您可以有效地理解和优化您的 SQL 查询。

一张图看懂sql运行顺序

SQL执行顺序:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY。

FROM:首先确定数据源。
对于多表JOIN,首先创建临时表。
示例:FROM 员工 JOIN 部门 d ON e.dept_id = d.id 生成包含员工和部门信息的中间表。

WHERE:再次过滤数据。
按条件过滤行。
示例:WHERE e.salary > 5 000 AND d.location = '北京' 排除工资≤5 000或部门不在北京的记录。

GROUP BY:分组聚合。
按字段分组并使用聚合函数计算值。
示例:GROUP BY d.name HAVING AVG(e.salary) > 1 0000 按部门分组,筛选出平均薪资>1 0000的部门。

HAVING:过滤组结果。
使用条件过滤分组数据。
如上例,平均薪资>1 0000的部门被过滤掉。

SELECT:创建结果集。
定义输出字段、处理别名并删除重复项。
示例:SELECT d.name AS Department, AVG(e.salary) AS avg_salary 生成包含部门名称和平均工资的中间结果。

排序依据:最后排序。
按字段升序或降序排序。
示例:ORDER BY avg_salary DESC 平均工资从最高到最低排列。

总结:SELECT 和 ORDER BY 逻辑上排在最后。
SELECT 决定输出内容,ORDER BY 决定输出顺序。
其他子句按照编写顺序执行以产生中间结果。

WHERE 无法使用 SELECT 的别名,因为别名尚未生成。