网站首页 > 技术文章 正文
对于 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 会先对中间表进行聚合再进行排序操作。如果中间表过大,会导致排序和聚合操作变慢,此时需要考虑优化查询语句或者增加合适的索引来提升性能。
结束语
对于本文中的内容,不知道你有没有什么看法,欢迎在评论区里留言。如果你对我的文章内容感兴趣,欢迎点击关注,谢谢支持![谢谢][谢谢][谢谢]
猜你喜欢
- 2024-12-22 项目案例:Java多线程批量拆分List导入数据库
- 2024-12-22 8个SQL错误:您是否犯了这些错误? sql有问题
- 2024-12-22 如何使用 SQL UPDATE 和 DELETE 语句更新或删除表数据
- 2024-12-22 一文搞懂各种数据库SQL执行计划:MySQL、Oracle等
- 2024-12-22 MySQL数据库语句 数据库mysql基本语句用法
- 2024-12-22 灵魂一问:为什么ES比MySQL更适合复杂条件搜索?
- 2024-12-22 MySQL原理简介—11.优化案例介绍 mysql原理详解
- 2024-12-22 MySQL 表关系、外键、多表查询、子查询
- 2024-12-22 MYSQL数据库基础和常用语法汇总03篇-数据查询
- 2024-12-22 微软发布Win10八月累积更新:14项优化和改进,修复142个漏洞
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)