MySQL SELECT语句执行顺序

MySQL中一条完整的SELECT语句的执行顺序如下:


一、MySQL SELECT语句的书写顺序

首先,我们平时书写SELECT语句的顺序是:

sql 复制代码
SELECT DISTINCT <字段列表>
FROM <表名>
JOIN <连接表> ON <连接条件>
WHERE <筛选条件>
GROUP BY <分组字段>
HAVING <分组后的条件>
ORDER BY <排序字段>
LIMIT <记录条数>;

二、MySQL SELECT语句的实际执行顺序

然而,MySQL在执行时的实际顺序与书写顺序不同,真实的执行顺序如下:

执行顺序 子句 功能描述
1 FROM 从指定表中读取数据
2 JOIN 根据连接条件进行表连接
3 WHERE 对连接后的数据进行条件过滤
4 GROUP BY 对数据进行分组
5 HAVING 对分组后的数据再次过滤
6 SELECT 选择需要的字段(列),计算表达式
7 DISTINCT 去除重复记录
8 ORDER BY 对结果进行排序
9 LIMIT 限制返回记录的数量

三、执行顺序示例说明

假设有如下SQL查询:

sql 复制代码
SELECT DISTINCT department, COUNT(*) AS total_employees
FROM employees
JOIN departments ON employees.dept_id = departments.id
WHERE salary > 5000
GROUP BY department
HAVING total_employees >= 5
ORDER BY total_employees DESC
LIMIT 10;

实际执行顺序:

  1. FROM employees

    employees表中读取数据。

  2. JOIN departments ON employees.dept_id = departments.id

    根据连接条件将employees表与departments表连接起来。

  3. WHERE salary > 5000

    过滤出薪资大于5000的记录。

  4. GROUP BY department

    按部门进行分组。

  5. HAVING total_employees >= 5

    过滤出员工数量大于或等于5的部门。

  6. SELECT DISTINCT department, COUNT(*) AS total_employees

    选择需要输出的字段,计算每个部门的员工总数。

  7. DISTINCT 去除可能存在的重复记录(通常与GROUP BY结合时DISTINCT可省略)。

  8. ORDER BY total_employees DESC

    按员工数量降序排序。

  9. LIMIT 10

    仅返回排序后的前10条记录。


四、执行顺序对SQL优化的启示

理解MySQL的实际执行顺序,有助于编写高效SQL:

  • 在WHERE条件中尽早过滤数据,减少后续步骤的数据量。
  • JOIN时尽量使用索引列,提升连接效率。
  • GROUP BY和HAVING中避免复杂计算,尽量简洁明确。
  • ORDER BY和LIMIT结合使用,避免不必要的排序开销。

五、小结

记住MySQL SELECT语句的实际执行顺序:

vbnet 复制代码
FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT

掌握这个顺序,有助于更好地理解SQL语句的执行逻辑,写出更高效、更易维护的SQL代码。

相关推荐
一 乐2 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
码事漫谈3 小时前
Protocol Buffers 编码原理深度解析
后端
码事漫谈3 小时前
gRPC源码剖析:高性能RPC的实现原理与工程实践
后端
踏浪无痕4 小时前
AI 时代架构师如何有效成长?
人工智能·后端·架构
程序员小假4 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
武子康6 小时前
大数据-209 深度理解逻辑回归(Logistic Regression)与梯度下降优化算法
大数据·后端·机器学习
maozexijr6 小时前
Rabbit MQ中@Exchange(durable = “true“) 和 @Queue(durable = “true“) 有什么区别
开发语言·后端·ruby
源码获取_wx:Fegn08956 小时前
基于 vue智慧养老院系统
开发语言·前端·javascript·vue.js·spring boot·后端·课程设计
独断万古他化6 小时前
【Spring 核心: IoC&DI】从原理到注解使用、注入方式全攻略
java·后端·spring·java-ee
毕设源码_郑学姐6 小时前
计算机毕业设计springboot基于HTML5的酒店预订管理系统 基于Spring Boot框架的HTML5酒店预订管理平台设计与实现 HTML5与Spring Boot技术驱动的酒店预订管理系统开
spring boot·后端·课程设计