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)了解更多。