MySQL查询SQL语句的执行顺序的方法

 更新时间:2025年10月20日 08:49:50   作者:学亮编程手记  
本文详细介绍了MySQL SELECT语句各子句的逻辑执行顺序及各阶段作用,并结合常见场景说明执行流程,强调WHERE与HAVING区别、别名使用限制、JOIN条件及子查询执行特点,对优化和理解SQL查询有重要指导意义,需要的朋友可以参考下

标准执行顺序

MySQL在执行一条SELECT查询时,逻辑上的执行顺序如下:

FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT

让我详细解释每个阶段:

1. FROM阶段

首先确定数据来源,包括表连接操作。如果有JOIN,会先执行笛卡尔积或根据JOIN条件进行表连接。多个表的JOIN按从左到右的顺序执行。

2. WHERE阶段

对FROM阶段产生的结果集进行条件过滤,筛选出符合条件的行。此时还不能使用SELECT中定义的别名,因为SELECT还没执行。

3. GROUP BY阶段

按照指定的列对数据进行分组,为聚合函数的计算做准备。

4. HAVING阶段

对分组后的结果进行过滤,通常与聚合函数配合使用。HAVING可以使用SELECT中的别名(某些MySQL版本支持)。

5. SELECT阶段

选择要返回的列,执行计算、函数调用等操作,生成最终的列。

6. DISTINCT阶段

如果有DISTINCT关键字,对结果集去重。

7. ORDER BY阶段

对结果集进行排序。可以使用SELECT中定义的别名。

8. LIMIT阶段

限制返回的行数,通常用于分页。

常见场景示例

场景1:基础查询

SELECT name, age
FROM users
WHERE age > 18
ORDER BY age DESC
LIMIT 10;

执行顺序:FROM users → WHERE age > 18 → SELECT name, age → ORDER BY age DESC → LIMIT 10

场景2:聚合查询

SELECT department, COUNT(*) as emp_count, AVG(salary) as avg_salary
FROM employees
WHERE status = 'active'
GROUP BY department
HAVING COUNT(*) > 5
ORDER BY avg_salary DESC;

执行顺序:FROM employees → WHERE status = ‘active’ → GROUP BY department → HAVING COUNT() > 5 → SELECT department, COUNT(), AVG(salary) → ORDER BY avg_salary DESC

场景3:多表JOIN

SELECT u.name, o.order_date, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.order_date > '2025-01-01'
ORDER BY o.order_date DESC;

执行顺序:FROM users u → INNER JOIN orders o → WHERE o.order_date > ‘2025-01-01’ → SELECT u.name, o.order_date, o.amount → ORDER BY o.order_date DESC

场景4:子查询

SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
ORDER BY salary DESC;

执行顺序:先执行子查询得到平均工资 → FROM employees → WHERE salary > 子查询结果 → SELECT name, salary → ORDER BY salary DESC

场景5:DISTINCT去重

SELECT DISTINCT city
FROM customers
WHERE country = 'China'
ORDER BY city;

执行顺序:FROM customers → WHERE country = ‘China’ → SELECT city → DISTINCT → ORDER BY city

场景6:复杂的多表关联与分组

SELECT d.name as dept_name, COUNT(e.id) as employee_count
FROM departments d
LEFT JOIN employees e ON d.id = e.department_id AND e.status = 'active'
WHERE d.region = 'East'
GROUP BY d.id, d.name
HAVING employee_count > 0
ORDER BY employee_count DESC
LIMIT 5;

执行顺序:FROM departments d → LEFT JOIN employees e (包含ON条件) → WHERE d.region = ‘East’ → GROUP BY d.id, d.name → HAVING employee_count > 0 → SELECT d.name, COUNT(e.id) → ORDER BY employee_count DESC → LIMIT 5

重要注意事项

WHERE vs HAVING的区别:WHERE在分组前过滤,不能使用聚合函数;HAVING在分组后过滤,可以使用聚合函数。

别名的使用限制:WHERE子句中不能使用SELECT中定义的别名,因为WHERE先于SELECT执行。但ORDER BY和HAVING可以使用别名。

JOIN的ON条件:在FROM阶段执行,早于WHERE条件,因此在LEFT JOIN中,ON条件和WHERE条件的效果可能不同。

子查询的执行:相关子查询可能会对外层查询的每一行都执行一次,非相关子查询通常只执行一次。

理解这个执行顺序对编写高效SQL、理解查询结果以及优化查询性能都非常重要。

以上就是MySQL查询SQL语句的执行顺序的方法的详细内容,更多关于MySQL查询SQL语句执行顺序的资料请关注脚本之家其它相关文章!

相关文章

  • Mysql分组排序取每组第一条的2种实现方式

    Mysql分组排序取每组第一条的2种实现方式

    开发中经常会遇到,分组查询最新数据的问题,下面这篇文章主要给大家介绍了关于Mysql分组排序取每组第一条的2种实现方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • MySQL中Replace语句用法实例详解

    MySQL中Replace语句用法实例详解

    mysql的replace函数是一个非常方便的替换函数,下面这篇文章主要给大家给大家介绍了关于MySQL中Replace语句用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • MySQL执行计划详解

    MySQL执行计划详解

    给大家带来了关于mysql的相关知识,主要介绍了从Mysql源码中分析执行计划,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈,需要的朋友可以参考下
    2022-09-09
  • mysql 8.0.18 安装配置图文教程

    mysql 8.0.18 安装配置图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.18 安装配置图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • MySQL 外键约束和表关系相关总结

    MySQL 外键约束和表关系相关总结

    一个项目中如果将所有的数据都存放在一张表中是不合理的,比如一个员工信息,公司只有2个部门,但是员工有1亿人,就意味着员工信息这张表中的部门字段的值需要重复存储,极大的浪费资源,因此可以定义一个部门表和员工信息表进行关联,而关联的方式就是外键。
    2021-06-06
  • Mysql DateTime 查询问题解析

    Mysql DateTime 查询问题解析

    这篇文章主要为大家介绍了Mysql DateTime查询问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • MySQL如何快速批量插入1000w条数据

    MySQL如何快速批量插入1000w条数据

    这篇文章主要给大家介绍了关于MySQL如何快速批量插入1000w条数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • mysql8.0.30用户与权限管理的实践

    mysql8.0.30用户与权限管理的实践

    MySQL8.0新加了很多功能,其中在用户管理中增加了角色的管理,本文主要介绍了mysql8.0.30用户与权限管理的实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • MySQL几点重要的性能指标计算和优化方法总结

    MySQL几点重要的性能指标计算和优化方法总结

    下面小编就为大家带来一篇MySQL几点重要的性能指标计算和优化方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL实现字段分割一行转多行的示例代码

    MySQL实现字段分割一行转多行的示例代码

    这篇文章主要介绍了MySQL实现字段分割一行转多行的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论