博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL 语句的解析过程
阅读量:4046 次
发布时间:2019-05-25

本文共 1805 字,大约阅读时间需要 6 分钟。

由于最近需要做一些sql query性能提升的研究,因此研究了一下sql语句的解决过程。在园子里看了下,大家写了很多相关的文章,大家的侧重点各有不同。本文是我在看了各种资料后收集总结的,会详细的,一步一步的讲述一个sql语句的各个关键字的解析过程,欢迎大家互相学习。

一、SQL语句的解析顺序

简单的说一个sql语句是按照如下的顺序解析的:

  • 1. FROM FROM后面的表标识了这条语句要查询的数据源。和一些子句如,(1-J1)笛卡尔积,(1-J2)ON过滤,(1-J3)添加外部列,所要应用的对象。FROM过程之后会生成一个虚拟表VT1。

 

  • (1-J1)笛卡尔积 这个步骤会计算两个相关联表的笛卡尔积(CROSS JOIN) ,生成虚拟表VT1-J1。

 

  • (1-J2)ON过滤 这个步骤基于虚拟表VT1-J1这一个虚拟表进行过滤,过滤出所有满足ON 谓词条件的列,生成虚拟表VT1-J2。

 

  • (1-J3)添加外部行 如果使用了外连接,保留表中的不符合ON条件的列也会被加入到VT1-J2中,作为外部行,生成虚拟表VT1-J3。

 

  • 2. WHERE 对VT1过程中生成的临时表进行过滤,满足where子句的列被插入到VT2表中。

 

  • 3. GROUP BY 这个子句会把VT2中生成的表按照GROUP BY中的列进行分组。生成VT3表。

 

  • 4. HAVING 这个子句对VT3表中的不同的组进行过滤,满足HAVING条件的子句被加入到VT4表中。

 

  • 5. SELECT 这个子句对SELECT子句中的元素进行处理,生成VT5表。

 

  • (5-1)计算表达式 计算SELECT 子句中的表达式,生成VT5-1

 

  • (5-2)DISTINCT 寻找VT5-1中的重复列,并删掉,生成VT5-2

 

  • (5-3)TOP 从ORDER BY子句定义的结果中,筛选出符合条件的列。生成VT5-3表

 

  • ORDER BY 从VT5-3中的表中,根据ORDER BY 子句的条件对结果进行排序,生成VC6表。

 

二、FROM子句

 

FROM子句标识了需要查询的表,如果指定了表操作,会从左到右的处理,每一个基于一个或者两个表的表操作都会返回一个输出表。左边表的输出结果会作为下一个表操作的输入结果。例如,交表相关的操作有 (1-J1)笛卡尔积,(1-J2)ON过滤器,(1-J3)添加外部列。FROM句子生成虚拟表VT1

 

1、执行笛卡尔积(CROSS JOIN)

 

笛卡尔积会把左右两个表每一行所有可能的组合都列出来生成表VT1-J1,如果左表有m列,右表有n列,那么笛卡尔积之后生成的VT1-J1表将会有m×n列。

 

Step 1-J1这个步骤等价于执行:

 

SELECT * from Customers C  CROSS JOIN Orders O

 

执行结果为:(共有4×7列)

 

C.customerid

C.city

O.orderid

O.customerid

FISSA

Madrid

1

FRNDO

FISSA

Madrid

2

FRNDO

FISSA

Madrid

3

KRLOS

FISSA

Madrid

4

KRLOS

FISSA

Madrid

5

KRLOS

FISSA

Madrid

6

MRPHS

FISSA

Madrid

7

NULL

FRNDO

Madrid

1

FRNDO

FRNDO

Madrid

2

FRNDO

FRNDO

Madrid

3

KRLOS

FRNDO

Madrid

4

KRLOS

FRNDO

Madrid

5

KRLOS

FRNDO

Madrid

6

MRPHS

FRNDO

Madrid

7

NULL

KRLOS

Madrid

1

FRNDO

KRLOS

Madrid

2

FRNDO

KRLOS

Madrid

3

KRLOS

KRLOS

Madrid

4

KRLOS

KRLOS

Madrid

5

KRLOS

KRLOS

Madrid

6

MRPHS

KRLOS

Madrid

7

NULL

MRPHS

Zion

1

FRNDO

MRPHS

Zion

2

FRNDO

MRPHS

Zion

3

KRLOS

MRPHS

Zion

4

KRLOS

MRPHS

Zion

5

KRLOS

MRPHS

Zion

6

MRPHS

MRPHS

Zion

7

NULL

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

你可能感兴趣的文章
MainActivity 会异步加载图片到相应的ImageView上
查看>>
妈妈十分生气的shooow
查看>>
怎么写一个温泉管理系统
查看>>
令人神清气爽的shooow
查看>>
指导教师的shooow
查看>>
leetcode面试题01.06.字符串压缩,超出时间限制,样例通过31/32
查看>>
机器学习实战、第二章KNN算法详解、AttributeError: ‘dict‘ object has no attribute ‘iteritems‘
查看>>
leetcode 535 TinyURL 的加密与解密 暴力 年轻人不讲武德—shooter7的博客
查看>>
课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)
查看>>
leetcode1792第232场周赛第三题,以及二维数组根据某一列进行排序——优先队列
查看>>
学生网上选课管理系统的设计与实现—计算机类专业课程设计(毕业设计)
查看>>
新建动态web工程项目红叉报错,以及Could not publish server configuration for Tomcat v9.0 Server at localhost.
查看>>
机器学习SVM的车牌识别系统—计算机专业课程设计(毕业设计)
查看>>
leetcode 80. 删除有序数组中的重复项 II
查看>>
课程设计(毕业设计)—学生宿舍管理系统—计算机类专业
查看>>
毕业设计(课程设计)—SpringBoot网上订餐系统的设计与实现—计算机类专业课程设计(毕业设计)
查看>>
毕业设计(课程设计)—个人博客系统(微博)的设计与实现—计算机类专业课程设计(毕业设计)
查看>>
牛客(中兴捧月)—B-切绳子
查看>>
剑指Offer 13.机器人的运动范围——DFS和BFS
查看>>
Java中GUI编程总结—AWT中的Frame容器、panel面板、布局管理
查看>>