图解SQL的各种连接(Inner join,outer join,left join,right join)

      由于 SQL Join 似乎被默认为基础,同时利用 ‘文氏图表’ 解释它,乍一看似乎是很自然的选择。然而,就像文章下面说的,我也发现在实际测试中,文氏图并没有完全符合SQL Join 语法。


     通过图文并茂的方式对SQL的Join进行简单的介绍:join大致分为以下七种情况:


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. -- ----------------------------  
  36. -- Records of test_b  
  37. -- ----------------------------  
  38. INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'1', N'梨子')  
  39. GO  
  40. GO  
  41. INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'2', N'苹果')  
  42. GO  
  43. GO  
  44. INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'3', N'草莓')  
  45. GO  
  46. GO  
  47. INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'4', N'桃子')  
  48. GO  
  49. GO  
  50. INSERT INTO [dbo].[test_b] ([id], [name]) VALUES (N'5', N'香蕉')  
  51. GO  
  52. 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   
222

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   
222

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   
222

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   
222

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   
222

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   
222

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   
222

H. cross join

表A和表B的数据进行一个N*M的组合,即笛卡尔积(交差集)。一般来说,我们很少用到这个语法。因为这种集合的使用对于性能来说非常危险,尤其是表很大。这里就不做介绍了…
                                                            内容更新于:2017-02-17
                                  



  • 12
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
INNER JOIN 是一种用于在数据库连接多个数据表的查询语句。它可以通过共享相同字段的值来将多个表的数据合并在一起,使得我们可以根据特定的条件从多个表中检索和筛选数据。INNER JOIN 语句的用法可以根据需要连接不同数量的表。 引用中给出了一个 INNER JOIN 连接五个数据表的示例,其中使用了嵌套的 INNER JOIN 语句来连接这些表。通过在每个 INNER JOIN 语句中指定连接条件,我们可以将这五个表中满足条件的数据行合并在一起。 引用提供了一个图解 SQL JOIN 的博文,可以更直观地理解 INNER JOIN 的使用方式。在图解中,可以看到 INNER JOIN 将两个表中相同字段值的数据行进行匹配,并将满足条件的数据行返回作为结果集。 引用则展示了 INNER JOIN 连接四个数据表的示例。这个示例与引用中的示例类似,使用嵌套的 INNER JOIN 语句根据连接条件将四个表中的数据行合并在一起。 总结来说,INNER JOIN 是一种用于连接多个数据表的查询语句,可以根据共享字段的值将表中的数据行合并在一起。可以根据需要连接不同数量的表,并通过指定连接条件进行数据匹配。 #### 引用[.reference_title] - *1* *3* [INNER JOIN多个表连接](https://blog.csdn.net/loster_Li/article/details/77479088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [mysql 开发技巧之JOIN 更新和数据查重/去重](https://download.csdn.net/download/weixin_38528939/14836741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值