MySQL语法顺序及执行顺序

一、书写顺序

 1 select[distinct]
 2 from
 3 join
 4 on
 5 where
 6 group by
 7 having
 8 union
 9 order by
10 limit

二、执行顺序

 1 from
 2 on
 3 join
 4 where
 5 group by (可以使用select中的别名,后面的语句中都可以使用)
 6 having
 7 select
 8 distinct
 9 union
10 order by
11 limit

以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。
1、首先对from子句中的前两个表执行一个笛卡尔乘积(交叉联接),此时生成虚拟表 VT1(选择相对小的表做基础表);
2、应用on筛选器,on 中的逻辑表达式将应用到 VT1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表 VT2;
3、如果是外连接,就将添加外部行;如果是左连接,就把左表在第二步中过滤的添加进来; 如果是右连接,就将右表在第二步中过滤掉的行添加进来,这样生成虚拟表 VT3 ;
如果 from 子句中的表数目多余两个表,那么就将VT3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 VT3;
4、对 VT3 应用 WHERE 筛选器,只有使为 true 的行才插入 VT4。
5、group by 子句将中的唯一的值组合成为一组,得到虚拟表VT5。如果应用了group by,那么后面的所有步骤都只能得到的VT5的列或者是聚合函数(count、sum、avg等)。原因在于最终的结果集中只为每个组包含一行;
6、应用cube或者rollup选项,为VT5生成超组,生成VT6.
7、应用having筛选器,生成VT7。having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器
8、处理select子句。将VT7中的在select中出现的列筛选出来。生成VT8.
9、应用distinct子句,VT8中移除相同的行,生成VT9。事实上如果应用了group by子句那么distinct是多余的;
10、应用order by子句。按照order_by_condition排序VT9,此时返回的一个游标,而不是虚拟表。sql是基于集合的理论的,集合不会预先对他的行排序,它只是成员的逻辑集合,成员的顺序是无关紧要的。对表进行排序的查询可以返回一个对象,这个对象包含特定的物理顺序的逻辑组织。这个对象就叫游标。正因为返回值是游标,那么使用order by 子句查询不能应用于表表达式;
11、应用limit,从游标开始处选择指定数量或比例的行,生成表 TT11,并返回给用户。

原文地址:https://www.cnblogs.com/aland-1415/p/10875162.html

时间: 2024-10-11 10:52:25

MySQL语法顺序及执行顺序的相关文章

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

很多程序员都很抵触SQL.其实SQL是一整为数不多的声明性语言,只是它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语言.甚至是函数语言. 今天大家共同学习下SQL的语法顺序与执行顺序.(入门级的.大神们可以直接点退出了哈.) SQL 是一种声明式语言 首先要把这个概念记在脑中:“声明”. SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果. SQL 语言声明的是结果集的属性,计算机会根据 SQL 所声明的内容来从数据库中挑选

程序顺序与执行顺序

这是两个不同的概念. 程序顺序指的是代码的先后顺序. 执行顺序可能受到重排序的影响,不一定和程序顺序保持一致,具有不确定性. 见: <单线程程序语义> <haappen before 规则> 原文地址:https://www.cnblogs.com/xmsx/p/9716583.html

SQL 中的语法顺序与执行顺序

FROM : HOME SQL 是一种声明式语言 SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果. SQL 语言声明的是结果集的属性,计算机会根据 SQL 所声明的内容来从数据库中挑选出符合声明的数据,而不是像传统编程思维去指示计算机如何操作. SQL 语句的语法顺序是: SELECT[DISTINCT] FROM WHERE GROUP BY HAVING UNION ORDER BY 执行顺序为: FROM WHERE GROUP

mysql查询语句的执行顺序(重点)

一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition> ORDER BY <o

mysql 中sql的执行顺序

文章转自  https://www.cnblogs.com/huminxxl/p/3149097.html 查询语句中select from where group by having order by的执行顺序 1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 select--from--where--group by--having--order by 其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,而是按照下面的顺

SQL语句的执行顺序--知道执行顺序,顺便可以做优化了,对吧

今天,被面试问到了一个问题,SQL的执行顺序,当时想的是,SQL有啥执行顺序,从上往下?当时瞎胡邹,说先执行from,为啥,不执行from怎么知道操作查询的是什么表,对吧,哎嘿,还蒙对了.下来之后总结了一下 (一)先讲讲查询吧 查询语句中select from where group by having order by的执行顺序 1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 select--from--where--group by--having--order by 其中sele

SQL的编写顺序和执行顺序,以及一些其他问题

SQL即结构化查询语言.也就是用来从数据库中操作数据的,增删改查CRUD. 一,sql的分类,大致有四类: 1)DDL : 数据定义语言 create alter drop truncate 2)DML : 数据操纵语言 insert update delete 3)DCL : 数据控制语言 安全 授权 grant revoke 4)DQL : 数据查询语言 select from子句 where子句 二,查询语句的结构 select [列名] [*] from 表名 [where 条件] [g

【转】netty4.1.32 pipeline的添加顺序和执行顺序

原文:https://www.cnblogs.com/ruber/p/10186571.html 本文只想讨论一下pipeline的执行顺序问题,因为这个搞不明白就不知道先添加编码还是解码,是不是可以混淆添加等等一系列事情 1 pipeline.addLast(new outboundsHandler1()); //out1 2 pipeline.addLast(new outboundsHandler2()); //out2 3 4 pipeline.addLast(new InboundsH

mysql 语句的内部执行顺序

在做面试题目的时候做到了,然而不太肯定,后来看了下面的这篇博客,觉得说的很清晰,故摘录到这里:地址:http://www.cnblogs.com/rollenholt/p/3776923.html MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回.如果没有在语句中指定某一个子句,那么将会跳过相