简单了解MySQL SELECT执行顺序

 更新时间:2019年05月22日 09:26:07   作者:freefish_yzx  
MySQL数据据库中我们经常使用SQL SELECT语句来查询数据,那么关于它的执行顺序,下面小编来带大家简单了解一下

SELECT语句的完整语法为:

(7) SELECT 
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>

说明:语法前面的序号为SELECT执行顺序

MySQL的SELECT执行顺序一共分为10步,如上所标注的那样,最先执行的是FROM操作,最后执行的是LIMIT操作。其中每一次操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回。如果没有在语句中指定某一个子句,那么将会跳过相应的步骤。

下面我们来具体分析一下查询处理的每一个阶段

SELECT a.customer_id, COUNT(b.order_id) as total_orders
 FROM table1 AS a
 LEFT JOIN table2 AS b
 ON a.customer_id = b.customer_id
 WHERE a.city = 'hangzhou'
 GROUP BY a.customer_id
 HAVING count(b.order_id) < 2
 ORDER BY total_orders DESC;

1、FORM: 对FROM左边的表和右边的表计算笛卡尔积,产生虚表VT1。

2、ON: 对虚表VT1进行ON过滤,只有那些符合<join-condition>的行才会被记录在虚表VT2中。

3、JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3。

4、WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。

5、GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5。

6、HAVING: 对虚拟表VT5应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT6中。

7、SELECT: 执行select操作,选择指定的列,插入到虚拟表VT7中。

8、DISTINCT: 对VT7中的记录进行去重。产生虚拟表VT8.

9、ORDER BY: 将虚拟表VT8中的记录按照<order_by_list>进行排序操作,产生虚拟表VT9.

10、LIMIT:取出指定行的记录,产生虚拟表VT10, 并将结果返回。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Mysql连接数的基本知识讲解

    Mysql连接数的基本知识讲解

    这篇文章主要介绍了Mysql连接数的基本知识,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • 实战MySQL升级的最佳方法

    实战MySQL升级的最佳方法

    这篇文章给大家从理论到实战详细分享了MySQL升级的最佳方法,有需要的朋友跟着学习操作下吧。
    2017-12-12
  • 解决MySQL 5.7中定位DDL被阻塞的问题

    解决MySQL 5.7中定位DDL被阻塞的问题

    这篇文章主要介绍了MySQL 5.7中如何定位DDL被阻塞的问题,在MySQL 5.7中,针对MDL,引入了一张新表performance_schema.metadata_locks,该表可对外展示MDL的相关信息,包括其作用对象,类型及持有等待情况。对此问题感兴趣的朋友参考下本文
    2018-08-08
  • Mac 下 MySQL5.7.22的安装过程

    Mac 下 MySQL5.7.22的安装过程

    这篇文章主要介绍了Mac 下 MySQL5.7.22的安装过程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • 查看修改MySQL表结构命令

    查看修改MySQL表结构命令

    这篇文章主要介绍了查看修改MySQL表结构命令,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • mysql 5.5 开启慢日志slow log的方法(log_slow_queries)

    mysql 5.5 开启慢日志slow log的方法(log_slow_queries)

    MySQL中提供了一个慢查询的日志记录功能,可以把查询SQL语句时间大于多少秒的语句写入慢查询日志,日常维护中可以通过慢查询日志的记录信息快速准确地判断问题所在
    2016-05-05
  • MySql 查询符合条件的最新数据行

    MySql 查询符合条件的最新数据行

    这篇文章主要介绍了MySql 怎么查出符合条件的最新的数据行,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 解决MySql客户端秒退问题(找不到my.ini)

    解决MySql客户端秒退问题(找不到my.ini)

    这篇文章主要介绍了解决MySql客户端秒退问题(找不到my.ini),本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • MySQL 替换某字段内部分内容的UPDATE语句

    MySQL 替换某字段内部分内容的UPDATE语句

    至于字段内部分内容:比如替换标题里面的产品价格,接下来为你详细介绍下UPDATE语句的写法,感兴趣的你可以参考下哈,希望可以帮助到你
    2013-03-03
  • 解析在MYSQL语法中使用trim函数删除两侧字符

    解析在MYSQL语法中使用trim函数删除两侧字符

    本篇文章是对在MYSQL语法中使用trim函数删除两侧字符的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-07-07

最新评论