SQL: LEFT JOIN , RIGHT JOIN , INNER JOIN 區別 , on 和 where條件的區別

    數據庫在經過鏈接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,而後再將這張臨時表返回給用戶。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過濾

    

  若是有表述不清,或者有誤,請評論告訴我。

相關文章
相關標籤/搜索