SQL语句书写顺序和执行顺序

(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <main_table>
(3) <join_type> JOIN <join_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 →FROM → JOIN → ON → WHERE → GROUP BY → HAVING → ORDER BY→ LIMIT

而执行顺序按照左侧编号进行。即:

FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT →DISTINCT → ORDER BY→ LIMIT

MySql执行顺序理解

  1. 加载 from关键词后面跟的表,计算笛卡尔积,生成虚拟表vt1。这也是sql执行的第一步:表示要从数据库中执行哪些表。

  2. 筛选关联表中满足on表达式的数据,保留主表数据,并生成虚拟表vt2。join表示要关联的表,on代表连接条件。

  3. 如果使用的是外连接,执行on的时候,会将主表中不符合on条件的数据也加载进来,作为外部行。

  4. 如果from子句中涉及多张表,则重复第一步到第三步,直至所有的表都加载完毕,更新vt3。

  5. 执行where表达式,筛选出符合条件的数据生成vt4。

  6. 执行 group by 子句进行分组。分组会把子句组合成唯一值并且每个唯一值只包含一行,生成vt5。一旦执行group by,后面的所有步骤只能操作vt5中的列(group by的子句包含的列)和聚合函数。

         温馨提示:这一步开始才可以使用select中的别名,它返回的是一个游标,而不是一张表,所以在where中不可以使用select中的别名,而having却可以。

  7. 执行聚合函数,例如sum、avg等,生成vt6。

  8. 执行having表达式,筛选vt6中的数据。having是唯一一个可以在分组后执行的条件筛选表达式,生成vt7。

  9. 执行SELECT,从vt7中筛选列,生成vt8。

  10. 执行distinct,对vt8去重,生成vt9。

         其实执行过group by后就没必要再去执行distinct,因为分组后,每组只会有一条数据,并且每条数据都不相同。

  11. 按照order_by_condition 对vt9进行排序,此处亦可以使用别名。这个过程比较耗费资源。

  12. 执行 limit 语句,取出指定条数的结果集返回给客户端。

实例

select g.student_id, sum(成绩) as sum成绩
from t_grade g INNER JOIN t_student s on g.student_id = s.id
where s.clasz = '高一1班'
group by g.student_id
having sum成绩 > 600
order by sum成绩

在上面的MySQL代码示例中,SQL 语句的执行顺序如下:

  1. 首先执行 FROM 子句, 从表 t_grade 和 t_student 组装数据源的数据,执行一个笛卡尔乘积,此时生成虚拟表 vt1。

  2. 接下来便是应用on筛选器,on 中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足 on 逻辑表达式的结果集,生成虚拟表 vt2。

  3. 由于是 inner join,故把两张表过滤的行添加进来,生成虚拟表vt3。

  4. 执行 WHERE 子句, 筛选 vt3中高一1班所有数据。

  5. 执行 GROUP BY 子句, 按 student_id 列进行分组。

    温馨提示:这一步开始才可以使用select中的别名,它返回的是一个游标,而不是一张表,所以在where中不可以使用select中的别名,而having却可以。

  6. 使用聚合函数 sum() 计算各位同学的总成绩。

  7. 执行 HAVING 子句, 筛选课程总成绩大于 600 分的学生。

知识扩展

on和where的区别

简单地说,当有外关联表时,on主要是针对外关联表进行筛选,主表保留;当不是外关联表时,二者作用相同。例如在左外连时,首先执行on,筛选掉外连表中不符合on表达式的数据,而where的筛选是对on关联后的结果集进行筛选。

limit 分页

若每页显示条目数记为pageSize,显示的页数记为page,则有:

SELECT * FROM table_name LIMIT (page-1)* pageSize, pageSize

结束语

了解了MySQL中SQL的执行顺序,对我们开发者大有裨益,可以写出更健壮的代码。

本文总结了mysql的书写顺序和执行顺序,理解这些有助于优化sql语句,有助于掌握 MySQL 中的 sql 语句从写出来到最终执行的轨迹,有助于深入和细致的认识 sql,提高数据库理解能力。同时,对于复杂sql的执行过程、编写都会有一定程度的意义。

以上就是这篇文章的全部内容了,希望本文对大家的学习或者工作具有一定的参考和学习价值;如果有疑问,大家可以在评论区留言交流,也希望大家多多点赞关注。谢谢大家对楼兰的胡杨的支持!

Reference

  1. https://blog.51cto.com/13593129/2357192?source=dra
  2. https://www.cnblogs.com/liangbaikai00/p/13392695.html

MySQL SQL语句书写顺序和执行顺序的更多相关文章

  1. 009 面试题 SQL语句各部分的执行顺序

    SQL语句各部分的执行顺序 select distinct...from t1 (left/right) join t2 on t1.xx=t2.xx where t1.xx=? and t2.xx= ...

  2. SQL 语句与性能之执行顺序

    select * , t3.Name from t1 left join t2 on t1.sysno = t2.Asysno left join t3 on t3.sysno = t2.Bsysno ...

  3. sql 语句 嵌套子查询 执行顺序分析

    --创建测试数据create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))inser ...

  4. SQL语句到底是怎么执行的

    写在前面的话:有时不理解SQL语句各个部分执行顺序,导致理解上出现偏差,或者是书写SQL语句时随心所欲,所以有必要了解一下sql语句的执行顺序.可以有时间自己写一个简单的数据库,理解会更加深入.下面就 ...

  5. mysql语句的书写顺序和执行顺序

    mysql语句的书写顺序和执行顺序有很大差异. 书写顺序,mysql的一般书写顺写为: select <要返回的数据列> from <表名> <join, left jo ...

  6. MYSQL语句中SELECT语句及其子句的执行顺序

    SELECT语句的执行的逻辑查询处理步骤:(8)SELECT (9)DISTINCT(11)<TOP_specification> <select_list>(1)FROM & ...

  7. SQL 中的语法顺序与执行顺序(转)

    很多程序员都很抵触SQL.其实SQL是一整为数不多的声明性语言,只是它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语言.甚至是函数语言. 今天大家共同学习下SQL的语法顺序与执行顺序.( ...

  8. Oracle-SQL语句的语法顺序和执行顺序

    SQL语句的语法顺序和执行顺序了,我们常见的SQL语法顺序如下: SELECT DISTINCT <Top Num> <select list>FROM [left_table ...

  9. mysql sql语句执行时是否使用索引检查方法

    在日常开发中,使用到的数据表经常都会有索引,这些索引可能是开发人员/DBA建表时创建的,也可能是在使用过程中新增的.合理的使用索引,可以加快数据库查询速度.然而,在实际开发工作中,会出现有些sql语句 ...

  10. mysql sql语句大全(转载)

      1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 ...

随机推荐

  1. Java Properties配置文件和XML配置文件读取

    一.properties类读取配置文件 1.从项目中读取properties配置文件,新建一个main程序,对应位置建立一个名称为config.properties配置文件,随意放置一些键值对.IDE ...

  2. WPF如何使用WebView,并且禁用F12和F5。

    客户端套浏览器壳,是如今比较浏览的客户端客户端开发方式.这篇文字简单来介绍一下如何在WPF中使用WebView 安装WebView的nuget包 可以直接执行安装命令 Install-Package ...

  3. Selenium KPI接口 警告弹 -alert/confirm/promp

    应用场景: 有些页面进入后自带弹窗提醒功能需要确认,这时候就需要将焦点定位到alert弹窗上. 使用格式: alert=driver.switchtoalert() alert.accept() 实现 ...

  4. 关于我这周的kotlin的学习:

    今天学习了kotlin方法的参数和一些lambda的一些知识,其中也是和我们上次日报中讲的方法一样,有三种分类,默认参数,具名参数,可变数量的参数.和以前一样,我们举个例子来理解这个知识点:先是默认方 ...

  5. nuclei安装使用

    go环境安装 go 下载路径:https://golang.google.cn/dl/ 1.双击 go1.20.7.windows-amd64.msi 2.点击下一步 3.我同意,然后下一步. 4.选 ...

  6. jQuery ajax 文件上传 Request Headers 缺少 boundary

    原文地址: https://blog.jijian.link/2020-07-28/jquery-ajax-upload-file/ 一般上传方式 const file = document.getE ...

  7. 【前端动画】—— 再看tweenJS

    16开始接触前端,一直对一个问题特别感兴趣,那就是js动画,也就是从那时起开始探究动画的各种表现形式,也是那个时候开始意识到编程这块东西最终考验的就是抽象和逻辑,而这一切完全是数学里边的东西. 最早接 ...

  8. 免费的编程连字等宽字体:Fira Code

    免费的编程连字等宽字体:Fira Code 介绍和特征 介绍 Fira 是 Mozilla 公司 主推的字体系列.Fira Code 专为写程序而生,开源免费.除了具有等宽等基本属性外,还加入了编程连 ...

  9. 栈的应用(后进先出 LIFO)--括号匹配问题

    博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- class Stack: def __init__(self): self ...

  10. CSAPP学习笔记——chapter8 异常控制流

    CSAPP学习笔记--chapter8 异常控制流 简介 异常控制流(Exceptional Control Flow,ECF)是在计算机系统中处理不寻常或异常情况的一种机制.它允许系统跳出正常的顺序 ...