MySQL中明确查询语句的执行顺序极其重要,了解执行顺序才不至于犯一些简单错误,例如having 后面是否可以使用 select 中重命名的列名等问题。另外SQL中实际使用最频繁的就是查询(Queing),要想写出高质量、高性能的查询语句,必须深入地了解SQL的逻辑查询处理顺序和机制。

一、查询语句的执行顺序

基础查询语句

(5) select distinct top(<取数说明>) <选择 列表>
(1) from <表1> <连接类型> join <表2> ON <连接条件>
(2) where <筛选条件>
(3) group by <分组条件>
(4) having <条件>
(6) order by <排序的列、排序规则>
(7) limit <选择行>

注意

1、select:避免使用 select * 。按照需要进行数据查询,否则会导致查询速度变慢。避免查询多余数据。

2、where:因为还没有对数据进行分组,所以where 不能和聚合函数(count、sum、max等函数)一起使用,也不能引用 select 列表中创建的别名,因为 select 还没有执行。

3、group by 和 having:在 group by 和 having 中不可以直接使用select中重命名的列。

4、order by:但是在 order by 中可以直接使用select中重命名的列。

5、limit:如果只需要查询出一条数据,使用 limit 1。例如,想要知道是否有男生,只要能查询到一条含有男生的记录就可以。使用Limit 1 可以在找到一条数据后停止搜索,避免多余查询。

SQL并没有按照编写语句的顺序曲执行语句。上边的序号,就是查询语句在执行过程中处理逻辑的顺序。

二、查询处理机制

每个执行过程主要做那些事呢,下面具体介绍:

(1)FROM

该过程从数据库中选取需要查询的表或视图。并处理表运算符。

在涉及到联接运算的查询中(各种join),主要有以下几个步骤:

  • 求笛卡尔积。不论是什么类型的联接运算,首先都是执行交叉连接(cross join),求笛卡儿积,生成虚拟表VT1-J1。
  • ON 筛选器。这个阶段对上个步骤生成的 VT1-J1 进行筛选,根据ON中出现的谓词进行筛选,让谓词取值为 true的行插入到VT1-J2。
  • 添加外部行。如果指定了 outer join,还需要将VT1-J2 中没有找到匹配的行,作为外部行添加到VT1-J2中,生成VT1-J3。

经过以上步骤,FROM 执行过程就完成了。

概括地讲,FROM 执行过程就是找到表并进行数据的预处理,根据条件对表进行处理。

(2)WHERE

从表或视图中筛选出满足条件的行。根据<筛选条件>中条件对 VT1中的行进行筛选,让满足条件的行插入到 VT2中。

(3)GROUP BY

根据指定的列对筛选出的行进行分组。按照指定的列名,将 VT2中的进行分组,生成VT3。最后每个分组只有一行。

(4)HAVING

从分组后的数据中筛选出满足条件的行。根据 having子句中出现的谓词对VT3的分组进行筛选,并将符合条件的组插入到 VT4中。

(5)SELECT

从表或视图中选取需要的列。这个阶段是投影的过程,处理select子句中提到的列,产生VT5。

一般按下列顺序进行:

  • 计算 select 列表中的表达式,生成VT5-1。
  • 若有 distinct,则删除VT5-1中的重复行,生成VT5-2。
  • 若有 top,则根据 order by 子句定义的逻辑顺序,从VT5-2 中选择签名指定数量或者百分比的行,生成VT5-3。

(6)ORDER BY

根据指定的列对筛选出的行进行排序。按照 order by 子句中指定的列名,对VT5中的行,进行排序,生成游标VC6。

(7)LIMIT

根据指定的条件对筛选出的行再次进行筛选。按照 limit 子句中指定的行的位置,对Vc6中的行进行选择,生成VT7。

参考

SQL查询执行顺序

MySQL 查询常用操作(0) —— 查询语句的执行顺序的更多相关文章

  1. MySQL 字段常用操作 添加,修改,删除,调整字段顺序

    整理备忘: 添加字段:alter table 表名Add column 字段名 字段类型  默认值 AFTER 字段名 (在哪个字段后面添加) 例子: alter table appstore_sou ...

  2. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  3. MySQL 查询in操作,查询结果按in集合顺序显示

    MySQL 查询in操作,查询结果按in集合顺序显示   select * from test where id in(3,1,5) order by find_in_set(id,'3,1,5'); ...

  4. mysql的常用操作的封装

    1.概述: 为了把繁琐的操作简化成简单的类,设计了2个类用来封装了mysql的常用操作,以便使用者可以方便地使用. 2.组成 1)数据库操作类CDatabaseConnect 2)SQL对象类CSql ...

  5. DBA必备:MySQL数据库常用操作和技巧

    DBA必备:MySQL数据库常用操作和技巧 2011-02-25 15:31 kaduo it168 字号:T | T MySQL数据库可以说是DBA们最常见和常用的数据库之一,为了方便大家使用,老M ...

  6. 浅谈SQL优化入门:1、SQL查询语句的执行顺序

    1.SQL查询语句的执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_ ...

  7. Oracle中的一些查询语句及其执行顺序

    查询条件: 1)LIKE:模糊查询,需要借助两个通配符,%:表示0到多个字符:_:标识单个字符. 2)IN(list):用来取出符合列表范围中的数据. 3)NOT IN(list): 取出不符合此列表 ...

  8. Linux下mysql的常用操作

    Linux下mysql的常用操作: 显示数据库 show databases; 选择数据库 use 数据库名; 显示数据库中的表 show tables; 显示数据表的结构 describe 表名; ...

  9. SQLServer2005中查询语句的执行顺序

    SQLServer2005中查询语句的执行顺序   --1.from--2.on--3.outer(join)--4.where--5.group by--6.cube|rollup--7.havin ...

  10. MySQL笔记-语句的执行顺序

    在一次查询线上问题时发现有以下两条同样的SQL,执行后数据的顺序不一样: SELECT * FROM nns_assists_item AS asset WHERE asset.nns_assist_ ...

随机推荐

  1. adb安装电视apk

    adb 是什么? 百度说明:adb工具即Android Debug Bridge(安卓调试桥) tools.它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互.在某些特殊的情况下进入不了系统 ...

  2. 编译安装nmon

    nmon 是什么? nmon(Nigel's performance Monitor for Linux)是一种Linux性能监视工具,当前它支持 Power/x86/x86_64/Mainframe ...

  3. go_xml_learn

    结构体转换为xml: type Person struct { XMLName xml.Name `xml:"person"` Name string `xml:"nam ...

  4. 后疫情办公时代——你需要的多人同步协同编辑Demo(可粘贴可撤销)

    新冠病毒的疫情使得在线办公成为了一个常态,这使得在线文档成为了时下的热点.其中在线协同表格是在线文档的重要一个组成部分,纯前端表格在在线协同表格上有着得天独厚的优势:本身已经实现了单人操作在线文档的基 ...

  5. .net core-利用PdfSharpCore 操作PDF实例

    前序 使用PdfSharpCore请注意使用XGraphics基类,与System.Drawing 的Graphics类似,XGraphics 提供XColor(颜色).XPen(画笔).XBrush ...

  6. 低代码开发平台YonBuilder移动开发,开发阅读APP教程

    ​ 设计实现效果如下图: 主要包括书架,阅读,收藏功能. 经过分析,我们可以先实现底部导航功能,和书架列表页面. 1. 使用 tabLayout 高级窗口实现底部导航 . 使用tabLayout 有两 ...

  7. Centos7下git最新版本安装

    刚重新装了centos7最小版的系统,发现没有git,只好重新安装了,记录下以防忘记.(以下命令最好在root用户下执行,要么你有管理员权限也行,则需要在命令前加sudo) 安装方法有两种: 一.yu ...

  8. Gvim基础操作(正则表达式)-02

    Gvim正则表达式 正则表达式在linux中使用非常广泛.主要是进行一些替换,在编写脚本的时候都会使用到.gvim.perl.sed.tcl中都会使用到. Gvim正则表达式的使用 搜索命令 /正则表 ...

  9. python读取kafka,输出到Vertica数据库

    # 主测试 # https://docs.python.org/2/library/json.html import sys import json import vertica_python imp ...

  10. 推荐一款在浏览器编辑`Blazor`的`IDE`

    不知道是否有Blazor用户羡慕过React或者Vue用户,在一些组件库中,它们就提供了在当前的组件预览对于组件的实时编辑并且预览? 比如semi-design的这种 在比如codepen这种 由于B ...