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 |
2、应用ON过滤,(JOIN 条件)
ON过滤条件是sql的三个过滤条件(ON,WHERE,HAVING)中最先执行的,ON过滤条件应用于前一步生成的虚拟表(VT1-J1),满足ON过滤条件的行会被加入到虚拟表VT1-J2中。在应用了ON 过滤之后,生成的VT1-J2表如下所示:
C.customerid |
C.city |
O.orderid |
O.customerid |
FRNDO |
Madrid |
1 |
FRNDO |
FRNDO |
Madrid |
2 |
FRNDO |
KRLOS |
Madrid |
3 |
KRLOS |
KRLOS |
Madrid |
4 |
KRLOS |
KRLOS |
Madrid |
5 |
KRLOS |
MRPHS |
Zion |
6 |
MRPHS |
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。