百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

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

wptr33 2025-01-04 23:27 18 浏览

对于 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 会先对中间表进行聚合再进行排序操作。如果中间表过大,会导致排序和聚合操作变慢,此时需要考虑优化查询语句或者增加合适的索引来提升性能。

结束语

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

相关推荐

一篇文章带你了解PHP的学习使用(php的教程)

ThinkPHP5实战...

在memcached管理php的session(memcached libevent)

PHP的session(会话管理)一般是以文件形式进行,而在多个Web服务器之间进行session管理时memecached会比文件管理方式更加方便。在这里介绍如何使用memcached管理PHP的s...

php传值和传引用的区别(php 传值和传引用)

php传值:在函数范围内,改变变量值得大小,都不会影响到函数外边的变量值。PHP传引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。传值:和copy是一样的。【打个比...

PHP 常量详解教程(php常量和变量)

常量类似变量,但是常量一旦被定义就无法更改或撤销定义。PHP常量常量是单个值的标识符(名称)。在脚本中无法改变该值。有效的常量名以字符或下划线开头(常量名称前面没有$符号)。注释:与变量不同,常...

php自学零基础入门小知识(php新手入门教程)

我们就把PHP入门当成一个苹果吧!一口一口的吃掉他!不啰嗦了!开始了1、嵌入方法:类似ASP的<%,PHP可以是<?php或者是<?,结束符号是?>,当然您也可以自己指定。2、...

PHP 语法详解(php语法大全)

PHP脚本在服务器上执行,然后向浏览器发送回纯HTML结果。基础PHP语法PHP脚本可放置于文档中的任何位置。PHP脚本以<?php开头,以?>结尾:<?php...

PHP笔记(一)PHP基础知识(php必背知识点)

创建PHP程序PHP代码框架<?php>2.文件命名规则...

PHP 8新特性之Attributes(注解),你掌握了吗?

PHP8的Alpha版本,过几天就要发布了,其中包含了不少的新特性,当然我自己认为最重要的还是JIT,这个我从2013年开始参与,中间挫折无数,失败无数后,终于要发布的东东。不过,今天呢,我不打算谈J...

PHP基本语法之标记与注释(php注释规范)

1、标记由于PHP是嵌入式脚本语言,它在实际开发中经常会与HTML内容混在一起,所以为了区分HTML与PHP代码,需要使用标记对PHP代码进行标识。如:<html>...

php注解(PHP注解 性能)

目标了解和使用php注解,如果你已经掌握其他一种具有注解的语言,例如:java、python等,你在本文中只需要了解点语法就行。示例php8以前的版本,注解写在注释里,如果你掌握其他语言的注解,你是不...

数据丢失?别慌!MySQL备份恢复攻略

想象一下,某个晴朗的午后,你正享受着咖啡,突然接到紧急电话:你的网站或APP彻底挂了!系统崩溃,界面全白。虽然心头一紧,但你或许还能安慰自己:系统崩溃只是暂停服务,数据还在,修复修复就好了。然而,如果...

MySQL 日志:undo log、redo log、binlog

今天来和大家分享MySQL的三个日志文件,可以说MySQL的多数特性都是围绕日志文件实现,而其中最重要的有以下三种:...

MySQL三大日志:binlog、redolog、undolog全解析

binlog概述在MySQL数据库中,binlog可是个相当重要的存在,它的全称为binarylog,也就是二进制日志。它就像是数据库的“记忆本”,记录了所有的DDL(数据定义语言)和...

1、MySQL数据库介绍(mysql数据库简单介绍)

1.1数据库的核心定义数据库的本质数据库乃存储数据对象之容器,涵盖如下关键组件:表(Table)...

MySQL 日志双雄:实时监控与历史归档实战优化

MySQL日志双雄:实时监控+历史归档实战用这招让你家日志系统再也不卡不爆炸MySQL十亿级日志处理:从洪峰到归档全攻略手把手教你用MySQL搞定ELK级日志监控在微服务架构大行其道的今天,日志系统早...