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


    數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶。

    例如如下兩張表:

    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過濾

    

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

  

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM