MySQL中SQL执行顺序及最容易踩的3个坑

 更新时间:2026年04月19日 15:33:20   作者:踏着七彩祥云的小丑  
SQL执行顺序是MySQL核心原理之一,深入理解它有助于我们编写出更高效、更可靠的查询语句,下面这篇文章主要介绍了MySQL中SQL执行顺序及最容易踩的3个坑,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、标准执行顺序

 FROM / JOIN / ON → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT

1. FROM / JOIN / ON

第一步:先找表!

  • 确定从哪张表取数据
  • 多表关联先拼接成一张大临时表

没有这一步,后面所有条件都无从谈起。

2. WHERE

第二步:过滤行!

  • 从大表里删掉不符合条件的数据
  • 对单条记录筛选
  • 不能用聚合函数(SUM/COUNT/AVG)

WHERE 越早过滤,后面计算越快。

3. GROUP BY

第三步:分组!

  • 把数据按字段分组(如按班级、性别分组)
  • 分组后,一行代表一组

4. HAVING

第四步:过滤分组!

  • 分组后的结果筛选
  • 可以用聚合函数
  • 必须在 GROUP BY 之后

WHERE 过滤行
HAVING 过滤组

5. SELECT

第五步:查要显示的列!

  • 最后才计算你要查的字段
  • 计算别名、表达式、函数
  • 聚合函数(SUM/COUNT)在这里执行

⚠️ 重点:WHERE 中不能用 SELECT 里的别名
因为 WHERE 比 SELECT 先执行!

6. DISTINCT

第六步:去重!

  • 对查询结果去掉重复行
  • 在 SELECT 之后执行

7. ORDER BY

第七步:排序!

  • 对最终结果排序
  • 可以用别名
  • 执行非常靠后

8. LIMIT

第八步:截取前几条!

  • 最后一步,只返回你要的行数

二、 SQL 完整演示执行顺序

你写的 SQL:

SELECT 
  class_name, COUNT(*) AS num
FROM student
WHERE age > 18
GROUP BY class_name
HAVING num > 10
ORDER BY num DESC
LIMIT 5;

真正执行顺序:

  1. FROM student 找到表
  2. WHERE age>18 过滤年龄
  3. GROUP BY class_name 按班级分组
  4. HAVING num>10 只保留人数>10的班级
  5. SELECT 计算班级名和数量
  6. ORDER BY 排序
  7. LIMIT 取前5

三、最容易踩的 3 个坑(必须记住)

坑1:WHERE 里不能用 SELECT 的别名

-- 错误
SELECT name AS n FROM student WHERE n='张三'

原因:WHERE 比 SELECT 先执行,根本不知道 n 是什么。

坑2:WHERE 不能用聚合函数

-- 错误
SELECT COUNT(*) FROM student WHERE COUNT(*)>10

正确写法:

SELECT COUNT(*) FROM student GROUP BY class HAVING COUNT(*)>10

坑3:HAVING 必须跟 GROUP BY

没有分组,就不能用 HAVING。

总结(最核心 3 条)

  1. FROM 最先执行
  2. WHERE 在 GROUP BY 前面
  3. SELECT 在 HAVING 之后、ORDER BY 之前

总结 

到此这篇关于MySQL中SQL执行顺序及最容易踩的3个坑的文章就介绍到这了,更多相关MySQL SQL执行顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何批量生成MySQL不重复手机号大表实例代码

    如何批量生成MySQL不重复手机号大表实例代码

    这篇文章主要给大家介绍了关于如何批量生成MySQL不重复手机号大表的相关资料,,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 线上MySQL的自增id用尽怎么办

    线上MySQL的自增id用尽怎么办

    MySQL的自增id都定义了初始值,然后不断加步长。虽然自然数没有上限,但定义了表示这个数的字节长度,那自增id用完,会怎么样?本文就来介绍一下
    2021-08-08
  • MySQL查看event执行记录的实现

    MySQL查看event执行记录的实现

    在使用EVENT的过程中,我们可能会需要查看EVENT的执行记录,以便了解它们是否按预期执行,本文就来介绍一下MySQL查看event执行记录的实现,感兴趣的可以了解一下
    2023-11-11
  • MySql数据引擎简介与选择方法

    MySql数据引擎简介与选择方法

    在MySQL 5.1中,MySQL AB引入了新的插件式存储引擎体系结构,允许将存储引擎加载到正在运新的MySQL服务器中
    2012-11-11
  • Mysql 默认字符集设置方法(免安装版)

    Mysql 默认字符集设置方法(免安装版)

    有些时候我们在使用非安装版的mysql是需要设置默认字符集的时候,就需要这样的修改了。安装版的可以选择的。
    2009-03-03
  • MySQL表自增id溢出的故障原因和解决方法

    MySQL表自增id溢出的故障原因和解决方法

    MySQL 表的自增 ID 溢出问题通常发生在使用 INT 或 BIGINT 类型的自增字段时,如果数据量极大,达到自增字段的最大值时,就会导致溢出,不同的数据库类型有不同的最大值,本文给大家介绍了MySQL表自增id溢出的故障原因和解决方法,需要的朋友可以参考下
    2024-12-12
  • Mysql修改字段名和修改字段类型的实例代码

    Mysql修改字段名和修改字段类型的实例代码

    MySQL中如何使用SQL语句来修改表中某一个字段的数据类型呢,下面这篇文章主要给大家介绍了关于Mysql修改字段名和修改字段类型的相关资料,需要的朋友可以参考下
    2022-05-05
  • MySQL InnoDB 二级索引的排序示例详解

    MySQL InnoDB 二级索引的排序示例详解

    这篇文章主要给大家介绍了关于MySQL InnoDB 二级索引的排序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Mysql 索引 BTree 与 B+Tree 的区别(面试)

    Mysql 索引 BTree 与 B+Tree 的区别(面试)

    这篇文章主要介绍了Mysql索引BTree与B+Tree的区别,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 优化Mysql数据库的8个方法

    优化Mysql数据库的8个方法

    本文通过8个方法优化Mysql数据库:创建索引、复合索引、索引不会包含有NULL值的列、使用短索引、排序的索引问题、like语句操作、不要在列上进行运算、不使用NOT IN和<>操作
    2013-11-11

最新评论