SQL 中join家族详解

近期频繁地和数据库打交道(各种表,每个表上百个字段,真是快吐血了)。言归正传,分析下上述sql 中(join、left join、right join、inner join、 full join)的区别。
先看例子:
FirstTable

INSERT INTO [MyPractice].[dbo].[FirstTable] VALUES('01','cnk','女','02')
INSERT INTO [MyPractice].[dbo].[FirstTable] VALUES('02','ww','女','01')
INSERT INTO [MyPractice].[dbo].[FirstTable] VALUES('03','wa','男','02')
INSERT INTO [MyPractice].[dbo].[FirstTable] VALUES('04','','','01')
INSERT INTO [MyPractice].[dbo].[FirstTable] VALUES('04','','','')
idnamesexp_id
01cnk02
02ww01
03wa02
0401
04

SecondTable

INSERT INTO [MyPractice].[dbo].[SecondTable] VALUES('01','cnk','女')
INSERT INTO [MyPractice].[dbo].[SecondTable] VALUES('02','ww','女')
INSERT INTO [MyPractice].[dbo].[SecondTable] VALUES('03','wa','男')
INSERT INTO [MyPractice].[dbo].[SecondTable] VALUES('04',' ',' ')
idnamesex
01cnk
02ww
03wa
04

Join

--join
SELECT * FROM [MyPractice].[dbo].[FirstTable]
JOIN [MyPractice].[dbo].[SecondTable] ON   [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id

上述sql执行结果

--join
SELECT * FROM [MyPractice].[dbo].[SecondTable] JOIN [MyPractice].[dbo].[FirstTable] ON   [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id

上述sql执行结果
小结
JOIN: 表中有至少一个匹配,则返回行。同时注意第二次结果并不是以第二张表开始。

Left join

--left join
SELECT * FROM [MyPractice].[dbo].[FirstTable]left join [MyPractice].[dbo].[SecondTable] ON   [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id

上述sql 执行结果

--left join
SELECT * FROM [MyPractice].[dbo].[SecondTable]
left join [MyPractice].[dbo].[FirstTable] ON   [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id

上述sql 执行结果
小结
Left join:即使右表中没有匹配,也从左表返回所有的行。哪张表在前就先加载那张表。

Right join

--right join
SELECT * FROM [MyPractice].[dbo].[FirstTable] left join [MyPractice].[dbo].[SecondTable] ON   [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id

上述sql 执行结果

--right join
SELECT * FROM [MyPractice].[dbo].[SecondTable] left join [MyPractice].[dbo].[FirstTable] ON   [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id

上述sql 执行结果
小结
right join: 即使左表中没有匹配,也从右表返回所有的行。

Full join

SELECT * FROM [MyPractice].[dbo].[FirstTable]
full join [MyPractice].[dbo].[SecondTable] ON   [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id

上述sql 执行结果

--full join
SELECT * FROM [MyPractice].[dbo].[SecondTable] full join [MyPractice].[dbo].[FirstTable] ON   [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id

上述sql 执行结果
小结
full join:只要其中一个表中存在匹配,就返回行。

Inner join

--inner join
SELECT * FROM [MyPractice].[dbo].[FirstTable]
inner join [MyPractice].[dbo].[SecondTable] ON  
[MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id

上述sql 执行结果

--inner join
SELECT * FROM [MyPractice].[dbo].[SecondTable] inner join [MyPractice].[dbo].[FirstTable] ON  [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id

上述sql 执行结果
小结
Inner join:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
Inner join 与 JOIN 是相同的。

总结完毕,欢迎指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值