2009-01-07 86 views
41

內連接和外連接(左連接,右連接)之間有什麼區別,哪些具有最佳性能?SQL加入差異

謝謝!

回答

78

檢查這篇文章:

A Visual Explanation of SQL Joins

內加入:

左外連接:

右外連接:

+0

問題的第二部分是關於性能,這不一定與連接方法直接相關,您是否有任何進一步的評論呢? – 2009-01-07 07:23:28

+0

請務必閱讀文章中的所有評論,因爲其作爲集合操作的連接呈現非常受批評!例如,左連接不是交集,因爲它創建了新的元組。 – bortzmeyer 2009-01-07 09:53:13

0

希望你明白的圖片。在性能方面,它們是相同的 - 沒有區別。

編輯:哎呀。猜猜你並不在意答案的這一部分。

3

A LEFT JOIN BB RIGHT JOIN A相同。有些RDBMS沒有RIGHT JOIN,所以你有你的RIGHT JOIN邏輯改寫爲LEFT JOIN邏輯

A 1 2 3 
B 2 3 4 3 

SELECT A.I FROM INNER JOIN B ON B.I = A.I; 

output: 2 3, 3 

SELECT A.I AS X, B.I AS Y FROM A LEFT JOIN B ON B.I = A.I; 

read above code as A on LEFT, JOINs B 

output: 

X Y 
1 NULL 
2 2 
3 3 
3 3 

SELECT A.I AS X, B.I AS Y FROM B RIGHT JOIN A ON A.I = B.I; 

看了上面的代碼B on RIGHT, JOINs A。這與左側的A相同。

無論左邊是什麼,總是被評估,總是有輸出。你能想象一個LEFT JOIN B,B RIGHT加入爲:

 var result = new Dictionary<int, int?>(); 

     var A = new int[] { 1, 2, 3 }; 
     var B = new int[] { 2, 3, 4, 3 }; 

     foreach (int aElem in A) 
     { 


      bool hasMatch = false; 
      foreach (int bElem in B) 
      { 
       if (bElem == aElem) 
       { 
        result.Add(aElem, bElem); 
        hasMatch = true; 
       } 
      } 

      if (!hasMatch) 
       result.Add(aElem, null); 
     } 



     foreach(int X in result.Keys) 
     { 
      MessageBox.Show(string.Format("X {0} Y {1}", X, result[X].HasValue ? result[X].Value.ToString() : "NULL" )); 
     } 
4

性能comparisions類型之間的連接是無關緊要的,因爲他們給不同的充結果集。即使內部連接速度更快,如果您需要左連接的結果(甚至包括與連接中的第二個表不匹配的記錄),也是如此。

3

左側,右側,內側和外側不影響性能,已經在這裏很好地解釋了它們。

但是有些提示可以添加到影響性能的連接中:散列,循環和合並。

查詢計劃員通常會決定執行哪些操作,但偶爾可以通過覆蓋它來提高性能。

loopjoin經過在第二表中的每一行中所述第一每一行。如果你有一個非常大的桌子和一個非常小的桌子,這很好。

A mergejoin按順序經過兩個表。如果兩個表已經按照您加入的字段排序,那麼可以非常快速。

hashjoin使用大量的臨時表的分組的輸出,因爲它通過排序接合數據。

一些專家DB還支持其他類型,比如位圖連接。