數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶。
例如如下兩張表:
A(aid int , aname char(10) )
B(aid int , aname char(10) )
對應數據:
執行語句: select * from a LEFT JOIN b on aid=bid
A左連接B , 先取A中的一條記錄 , 去匹配B表中每一條數據 , 假設A中其中一條數據是a1,B中一條數據是b1;
如果a1和b1 匹配 on 條件 ,在on中條件為 true , a1 b1 連在一起成為一條結果的數據,如果是false , 不成為結果;
然后a1 和 b2 ,a1 和 b3 …… 以此類推。
如果 a1 跟 B表中任何一條數據都不匹配,則會返回一條像第一條數據一樣的結果。B的列為 null 。
然后拿a2 和 b1 , a2和 b2 …… 以此類推。
所以左連接最后的結果數量,當A中和數據和B中的數據不止匹配一條時,會大於A的數據量。如果都沒有匹配,或者都匹配一條,就會等於A的數據量。
像以下例子:
SELECT * from a LEFT JOIN b on a.aid>b.bid
A右連接B類似也是類似,只是A和B角色互換。
select * from a right JOIN b on aid=bid
SELECT * from a RIGHT JOIN b on a.aid>b.bid
而inner join :
在 a(1-n) 和 B(1-n) 匹配時,只有 on 條件 為 true 時,才會連接為一條結果數據。否則不返回數據。
select * from a inner join b on aid =bid
如果語句中有連接on和where條件,sql 在執行時會先進行 連接, select * from a left join b on aid= bid , 相當於生成一張臨時表。
然后對where 條件 進行過濾,最后得到結果。
注意區分以下兩種情況
select * from a left join b on aid= bid and aid>3, 這只進行了 連接操作
select * from a left join b on aid= bid where aid>3, 連接操作以后還有where過濾
如果有表述不清,或者有誤,請評論告訴我。