SQL语句各个部分执行顺序

http://www.tuicool.com/articles/fERNv2

下面先给出上面的SQL语句的执行顺序,然后进行讲解:

(8)  select 
(9)  distinct 
(11)  top 1
(6)   Table1.id,COUNT(Table1.name) as nameCount 
(1)  from Table1
(3)  inner join Table2
(2)  on Table1.id=Table2.id
(4)  where Table1.id<4
(5)  group by Table1.id
(7)  having Table1.id<3
(10)  order by Table1.id desc

前方序号给出了执行的顺序:

(1)from:对Table1和Table2执行笛卡尔积,也就是两个表的行的各种组合,共5*5=25行,生成虚拟表VT1

(2)on:选择VT1中的那些Table1.id=Table2.id的所有行,生成虚拟表VT2。

(3)inner join:这里是内部连接,直接就是VT2,如果是outer join,如left join、right join、full join,那么还需要按照外部连接的规则,把VT1中没有匹配的行添加到VT2,生成VT3.

(4)where:选出VT3中Table1.id<4的表格,给虚拟表VT4.

(5)group by:按照Table1.id进行分组。

(6)COUNT:执行聚合函数,选出对应Table1.id的行数,生成的结果给虚拟表VT5

(7)having:选择VT5中Table1.id<3的所有结果,给虚拟表VT6

(8)select:选择VT6中相应的列,给虚拟表VT7

(9)distinct:将VT7中重复的行去除,生成VT8

(10)order by:将VT8的结果按照Table1.id进行排序, 这里没有生成一个新的表VT9 ,而是生成游标VC9。

(11)top:从游标VC9的开始处选择指定的行数,这里是1行,生成虚拟表VT10.

经过上面的过程,最终的SQL语句将VT10返回给用户使用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python3

mysql-数据库的操作

nformation_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等

11320
来自专栏java达人

MySQL 加锁处理分析

背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信...

31250
来自专栏高爽的专栏

探究InnoDB可重复读

在RC(Read Committed)和RR(Repeatable Read)两种事务隔离级别下,InnoDB存在两种数据读取方式: 快照读(Snapshot ...

26900
来自专栏蓝天

测试mktime和localtime_r性能及优化方法

26410
来自专栏PhpZendo

MySQL创建用户与授权

假如你在给用户'pig'@'%'授权的时候是这样的(或类似的):GRANT SELECT ON test.user TO 'pig'@'%',则在使用REVOK...

55810
来自专栏csxiaoyao

mysql 命令完全总结

45570
来自专栏MYSQL轻松学

一个MySQL死锁的问题分析

两个事务相互等待时,当一个等待时间超过设置的某一阀值时,对其中一个事务进行回滚,另一个事务就能继续执行。一般不需要人为介入,这种方法简单有效,在innodb中,...

42380
来自专栏Python攻城狮

PostgreSQL数据库在Debian8下的安装使用1.安装2.使用3.数据库操作4.安装过程中出现的问题5.常用SQL命令总结使用

博客地址:https://ask.hellobi.com/blog/zhiji 欢迎大家来交流学习。

9920
来自专栏枕边书

PHP中的数据库一、MySQL优化策略综述

前些天看到一篇文章说到PHP的瓶颈很多情况下不在PHP自身,而在于数据库。我们都知道,PHP开发中,数据的增删改查是核心。为了提升PHP的运行效率,程序员不光需...

34580
来自专栏Laoqi's Linux运维专列

Mysql指令select,update,insert,drop,truncate+MySQL数据库备份恢复

一、select: 1.1 选择db1中mysql库和user表: mysql> use db1 Database changed mysql> select ...

32780

扫码关注云+社区

领取腾讯云代金券