SQL中Left Join 與Right Join 與 Inner Join 與 Full Join與交叉連接與自連接的區別


首先看看Left Join 與Right Join 與 Inner Join 與 Full Join對表進行操作后得到的結果。

 


插入數據得到的表:

EMP表:

SAL表:

    • 左連接
      [sql]  view plain  copy
       
      1. select  * from EMP Left join SAL on EMP.ENAME = SAL.ENAME;  

      左連接,表EMP是主表,因此查詢結果是顯示EMP(主表)的全部信息和SAL(附表)與EMP相關的信息。
    • 右連接
      [sql]  view plain  copy
       
      1. Select * from EMP Right join SAL on EMP.ENAME = SAL.ENAME;  

      右連接,表SAL是主表,因此查詢結果顯示SALT(主表)的全部信息和EMP(附表)與SAL想關的信息。
    • 內連接
      [sql]  view plain  copy
       
      1. SELECT * FROM EMP inner join SAL on EMP.ENAME = SAL.ENAME;  

      內連接,顯示的是連個表相關的信息。
    • 全連接
      [sql]  view plain  copy
       
      1. SELECT * FROM EMP full join SAL on EMP.ENAME = SAL.ENAME;  

      全連接,顯示兩個表所有的信息。
    • 交叉連接:

      交叉連接將會返回被連接的兩個表的笛卡爾積,返回結果的行數等於兩個表行數的乘積。

      不加條件返回兩個表行數的乘積:

      首先准備了兩個表 (Student 和 Course),其中 Student 表中的 C_S_Id 字段為外鍵列,關聯的是 Course 表的 C_Id 主鍵列。

    • select * from Student s
      cross join Course c 
      1 select * from Student s
      2 cross join Course c 

      加上條件返回滿足條件表達式的兩個表的行:

      1 select * from Student s
      2 cross join Course c 
      3 where s.C_S_Id=c.C_Id

      PS:cross join后加條件只能用where,不能用on,這一點跟后面的自連接一樣。

      自連接:自連接,連接的兩個表都是同一個表,即自己連接自己。

      復制代碼
      1 -- 查詢出男生身高比女生身高矮的學生信息
      2 select s1.S_Name,s1.S_Sex,s1.S_Height,s2.S_Name,s2.S_Sex,s2.S_Height  
      3 from Student s1,
      4 Student s2 
      5 where s1.S_BirthDate=s2.S_BirthDate
      6 and s1.S_Height<s2.S_Height
      7 and s1.S_Sex='男' 
      8 and s2.S_Sex='女'
      復制代碼

      1 --查詢出學生身高一樣但是學號不一樣的學生信息
      2 select * from Student s1,Student s2
      3 where s1.S_Height=s2.S_Height
      4 and s1.S_StuNo<>s2.S_StuNo

      由於表的數據的原因,所以自連接的示例可能不太容易理解。可以看下面這個示例,根據表名查詢出表的主外鍵約束名,示例如下:

      1 select a.Name as 表名,b.Xtype as 鍵類型,b.Name as 鍵名
      2 from sysobjects a,sysobjects b
      3 where a.ID=b.parent_obj and a.name='Student'
      4 and b.Xtype in('F','PK')

      內連接如果沒有指定連接條件的話,和笛卡爾積的交叉連接結果一樣,但是不同於笛卡爾積的地方是,沒有笛卡爾積那么復雜要先生成行數乘積的數據表,內連接的效率要高於笛卡爾積的交叉連接。

      最后說明一下,交叉連接如果有WHERE子句的話,往往會先生成兩個表行數乘積的行的數據表然后再根據WHERE條件從中選擇。 

      因此,如果兩個表數據量太大,將會非常非常慢,不建議使用。


免責聲明!

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



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