优秀的编程知识分享平台

网站首页 > 技术文章 正文

一文看懂,MySQL的Select语句执行顺序是怎么样的?

nanyue 2024-12-22 19:57:36 技术文章 3 ℃

对于 MySQL 数据库,SELECT 语句是我们使用最多的一种语句,了解 SELECT 语句的执行顺序非常重要,可以帮助我们优化SQL语句,提高查询效率,避免出现错误和不必要的资源浪费。

在多表连接时,MySQL先进行表的关联,并根据表之间的关系建立一个笛卡尔积,然后再根据 WHERE 条件筛选出符合条件的数据。

执行顺序大概可分为以下几步:

1、从 FROM 子句中选择第一个表,通过 JOIN 子句将其余的表与第一个表关联。

2、根据 ON 子句或 WHERE 子句进行筛选,将不符合条件的数据去掉。

3、根据 GROUP BY 子句进行分组,统计每组数据的聚合值。

4、根据 HAVING 子句进行分组后的筛选,并根据 ORDER BY 子句进行排序,最后返回结果。

本文下面将具体讲解 SELECT 语句执行顺序

SELECT 语句执行顺序

MySQL 的 SELECT 语句执行顺序如下图所示:


1、FROM

FROM是SELECT语句中的第一个关键字,它告诉MySQL需要从哪些表中检索数据。在多表JOIN查询中,FROM子句会列出所有涉及的表,并依照查询顺序依次处理。

2、JOIN

JOIN语句用于连接两个或多个表,并将它们的行组合起来形成一个新的行集合。JOIN用于连接两个或多个表,根据关联列将它们合并成一张新表。JOIN操作可以分为以下几种类型:

  • INNER JOIN(内连接):只返回两个表都满足条件的记录。
  • LEFT JOIN(左连接):返回左表中的所有记录和右表中满足条件的记录。如果某个左表记录在右表中没有匹配记录,则右表返回NULL值。
  • RIGHT JOIN(右连接):和LEFT JOIN类似,只不过是返回右表中的所有记录和左表中满足条件的记录。
  • FULL OUTER JOIN(全连接):返回左表和右表中的所有记录,只要其中一个表中存在就满足匹配

3、ON 和 WHERE

ON 和 WHERE 子句用于指定查询的限制条件。在此子句中,我们可以使用比较操作符、逻辑运算符和高级函数来确定查询的限制条件。仅当记录满足 ON 和 WHERE 子句中的所有条件时,它们才会被包括在结果集中。WHERE子句是在ON子句之后使用的。

4、GROUP BY

GROUP BY 语句用于对查询结果根据一个或多个列进行分组。GROUP BY子句一般用于对连接后的结果集进行聚合运算

5、HAVING

HAVING 子句用于过滤聚合函数(如COUNT、AVG等)后的结果,HAVING 子句中条件可以与 WHERE 子句中的条件相同。不过,HAVING 和 WHERE 的一个最大区别是,WHERE过滤的是单个记录,而 HAVING 过滤的是分组后的记录。因此,HAVING 子句中的条件必须是基于分组后的列。

6、SELECT

在 SELECT 子句中指定要从结果集中返回的列。SELECT 子句中可以包含聚合函数、表达式和常量。

7、DISTINCT

DISTINCT 关键字用于删除结果集中重复的行。

8、ORDER BY

ORDER BY子句用于根据一个或多个列对查询结果进行排序。ORDER BY子句可以指定升序或降序排列。

9、LIMIT

LIMIT子句用于限制返回的行数。LIMIT子句可以接受一个或两个参数,第一个参数指定要返回的第一行的偏移量(默认为0),第二个参数指定要返回的行数(默认为所有)。

MySQL 的联表过程

在 MySQL 中进行多表 join 操作时,通常是通过建立一个虚拟的中间表(也称作临时表或者派生表)来完成的。

具体地说,在 MySQL 中进行 join 操作时,MySQL 会先将要参与 join 操作的表根据 on、where 等条件筛选出需要连接的数据,然后将这些数据暂存到一个临时表中。之后,MySQL 就会以这个临时表为基础来完成 join 操作,最终返回查询结果。

通常情况下,MySQL 会将中间表存储在内存中,由于内存的速度相对硬盘要快得多,因此可以提升查询效率,但如果数据量过大,中间表会超过内存大小而无法存储,此时 MySQL 会将其放入硬盘中进行存储,当然执行效率就会变慢。

如果在查询语句中使用了 Group By 或者 Order By 等聚合操作,MySQL 会先对中间表进行聚合再进行排序操作。如果中间表过大,会导致排序和聚合操作变慢,此时需要考虑优化查询语句或者增加合适的索引来提升性能。

结束语

对于本文中的内容,不知道你有没有什么看法,欢迎在评论区里留言。如果你对我的文章内容感兴趣,欢迎点击关注,谢谢支持![谢谢][谢谢][谢谢]

最近发表
标签列表