天天看點

圖解SQL的各種連接配接(Inner join,outer join,left join,right join)1準備資料

原文位址(原文寫的挺全的,直接拿過來了)

由于 SQL Join 似乎被預設為基礎,同時利用 ‘文氏圖表’ 解釋它,乍一看似乎是很自然的選擇。然而,就像文章下面說的,我也發現在實際測試中,文氏圖并沒有完全符合SQL Join 文法。

     通過圖文并茂的方式對SQL的Join進行簡單的介紹:join大緻分為以下七種情況:

圖解SQL的各種連接配接(Inner join,outer join,left join,right join)1準備資料

1準備資料

  1. DROP TABLE [dbo].[test_a]  
  2. GO  
  3. CREATE TABLE [dbo].[test_a] (  
  4. [id] int NULL ,  
  5. [name] varchar(255) NULL   
  6. )  
  7. GO  
  8. -- ----------------------------  
  9. -- Records of test_a  
  10. -- ----------------------------  
  11. INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'1', N'蘋果')  
  12. GO  
  13. GO  
  14. INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'2', N'橘子')  
  15. GO  
  16. GO  
  17. INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'3', N'鳳梨')  
  18. GO  
  19. GO  
  20. INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'4', N'香蕉')  
  21. GO  
  22. GO  
  23. INSERT INTO [dbo].[test_a] ([id], [name]) VALUES (N'5', N'西瓜')  
  24. GO  
  25. GO  
  26. -----------------------------------------------------------  
  27. DROP TABLE [dbo].[test_b]  
  28. GO  
  29. CREATE TABLE [dbo].[test_b] (  
  30. [id] int NULL ,  
  31. [name] varchar(255) NULL   
  32. )  
  33. GO  
  34. -- ----------------------------  
  35. -- Records of test_b  
  36. -- ----------------------------  
  37. INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'1', N'梨子')  
  38. GO  
  39. GO  
  40. INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'2', N'蘋果')  
  41. GO  
  42. GO  
  43. INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'3', N'草莓')  
  44. GO  
  45. GO  
  46. INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'4', N'桃子')  
  47. GO  
  48. GO  
  49. INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'5', N'香蕉')  
  50. GO  
  51. GO   

2示例介紹

A.Inner join

産生A和B的交集。

  1. SELECT  
  2.     *  
  3. FROM  
  4.     test_a  
  5. INNER JOIN test_b ON test_a.name = test_b.name   
圖解SQL的各種連接配接(Inner join,outer join,left join,right join)1準備資料

B. Full outer join

産生A和B的并集。對于沒有比對的記錄,則以null做為值。

  1. SELECT  
  2.     *  
  3. FROM  
  4.     test_a  
  5. FULL OUTER JOIN test_b ON test_a.name = test_b.name   
圖解SQL的各種連接配接(Inner join,outer join,left join,right join)1準備資料

C.Left outer join 

産生表A的完全集,而B表中比對的則有值,沒比對的以null值取代。

  1. SELECT  
  2.     *  
  3. FROM  
  4.     test_a  
  5. LEFT OUTER JOIN test_b ON test_a.name = test_b.name   
圖解SQL的各種連接配接(Inner join,outer join,left join,right join)1準備資料

D. Left outer join on where

産生在A表中有而在B表中沒有的集合。

  1. SELECT  
  2.     *  
  3. FROM  
  4.     test_a  
  5. LEFT OUTER JOIN test_b ON test_a.name = test_b.name  
  6. WHERE  
  7.     test_b.name IS NULL   
圖解SQL的各種連接配接(Inner join,outer join,left join,right join)1準備資料

E. RIGHT OUTER JOIN

産生表B的完全集,而A表中比對的則有值,沒比對的以null值取代。

  1. SELECT  
  2.     *  
  3. FROM  
  4.     test_a  
  5. RIGHT OUTER JOIN test_b ON test_a.name = test_b.name   
圖解SQL的各種連接配接(Inner join,outer join,left join,right join)1準備資料

F. right outer join on where

産生在B表中有而在A表中沒有的集合。

  1. SELECT  
  2.     *  
  3. FROM  
  4.     test_a  
  5. RIGHT OUTER JOIN test_b ON test_a.name = test_b.name  
  6. WHERE  
  7.     test_a.name IS NULL   
圖解SQL的各種連接配接(Inner join,outer join,left join,right join)1準備資料

G. FULL OUTER JOIN WHERE

産生(A表中有但B表沒有)和(B表中有但A表中沒有)的資料集。

  1. SELECT  
  2.     *  
  3. FROM  
  4.     test_a  
  5. FULL OUTER JOIN test_b ON test_a.name = test_b.name  
  6. WHERE  
  7.     test_a.name IS NULL  
  8. OR test_b.name IS NULL   
圖解SQL的各種連接配接(Inner join,outer join,left join,right join)1準備資料

H. cross join

表A和表B的資料進行一個N*M的組合,即笛卡爾積(交差集)。一般來說,我們很少用到這個文法。因為這種集合的使用對于性能來說非常危險,尤其是表很大。這裡就不做介紹了…

最後總結一下;

1.INNER JOIN 産生的結果是AB的交集

2.LEFT [OUTER] JOIN 産生表A的完全集,而B表中比對的則有值,沒有比對的則以null值取代。

3.RIGHT [OUTER] JOIN 産生表B的完全集,而A表中比對的則有值,沒有比對的則以null值取代。

4.FULL [OUTER] JOIN 産生A和B的并集。對于沒有比對的記錄,則會以null做為值。

5. CROSS JOIN 把表A和表B的資料進行一個N*M的組合,即笛卡爾積。産生N*M條記錄,在開發過程中我們肯定是要過濾資料,是以這種很少用。