數據庫在經過鏈接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,而後再將這張臨時表返回給用戶。sql
例如以下兩張表:數據庫
A(aid int , aname char(10) )3d
B(aid int , aname char(10) )blog
對應數據:select
執行語句: select * from a LEFT JOIN b on aid=bid im
A左鏈接B , 先取A中的一條記錄 , 去匹配B表中每一條數據 , 假設A中其中一條數據是a1,B中一條數據是b1;d3
若是a1和b1 匹配 on 條件 ,在on中條件爲 true , a1 b1 連在一塊兒成爲一條結果的數據,若是是false , 不成爲結果;數據
而後a1 和 b2 ,a1 和 b3 …… 以此類推。img
若是 a1 跟 B表中任何一條數據都不匹配,則會返回一條像第一條數據同樣的結果。B的列爲 null 。co
而後拿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過濾
若是有表述不清,或者有誤,請評論告訴我。