本文共 1805 字,大约阅读时间需要 6 分钟。
由于最近需要做一些sql query性能提升的研究,因此研究了一下sql语句的解决过程。在园子里看了下,大家写了很多相关的文章,大家的侧重点各有不同。本文是我在看了各种资料后收集总结的,会详细的,一步一步的讲述一个sql语句的各个关键字的解析过程,欢迎大家互相学习。
一、SQL语句的解析顺序
简单的说一个sql语句是按照如下的顺序解析的:
二、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 |
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。