网站首页 > 技术文章 正文
对于 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个漏洞
 
- 最近发表
 - 
- 聊一下 gRPC 的 C++ 异步编程_grpc 异步流模式
 - [原创首发]安全日志管理中心实战(3)——开源NIDS之suricata部署
 - 超详细手把手搭建在ubuntu系统的FFmpeg环境
 - Nginx运维之路(Docker多段构建新版本并增加第三方模
 - 92.1K小星星,一款开源免费的远程桌面,让你告别付费远程控制!
 - Go 人脸识别教程_piwigo人脸识别
 - 安卓手机安装Termux——搭建移动服务器
 - ubuntu 安装开发环境(c/c++ 15)_ubuntu安装c++编译器
 - Rust开发环境搭建指南:从安装到镜像配置的零坑实践
 - Windows系统安装VirtualBox构造本地Linux开发环境
 
 
- 标签列表
 - 
- cmd/c (90)
 - c++中::是什么意思 (84)
 - 标签用于 (71)
 - 主键只能有一个吗 (77)
 - c#console.writeline不显示 (95)
 - pythoncase语句 (88)
 - es6includes (74)
 - sqlset (76)
 - apt-getinstall-y (100)
 - node_modules怎么生成 (87)
 - chromepost (71)
 - flexdirection (73)
 - c++int转char (80)
 - mysqlany_value (79)
 - static函数和普通函数 (84)
 - el-date-picker开始日期早于结束日期 (76)
 - js判断是否是json字符串 (75)
 - c语言min函数头文件 (77)
 - asynccallback (87)
 - localstorage.removeitem (77)
 - vector线程安全吗 (73)
 - java (73)
 - js数组插入 (83)
 - mac安装java (72)
 - 无效的列索引 (74)
 
 
