近期频繁地和数据库打交道(各种表,每个表上百个字段,真是快吐血了)。言归正传,分析下上述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','','','')
id | name | sex | p_id |
---|---|---|---|
01 | cnk | 女 | 02 |
02 | ww | 女 | 01 |
03 | wa | 男 | 02 |
04 | 01 | ||
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',' ',' ')
id | name | sex |
---|---|---|
01 | cnk | 女 |
02 | ww | 女 |
03 | wa | 男 |
04 |
Join
--join
SELECT * FROM [MyPractice].[dbo].[FirstTable]
JOIN [MyPractice].[dbo].[SecondTable] ON [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id
--join
SELECT * FROM [MyPractice].[dbo].[SecondTable] JOIN [MyPractice].[dbo].[FirstTable] ON [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id
小结
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
--left join
SELECT * FROM [MyPractice].[dbo].[SecondTable]
left join [MyPractice].[dbo].[FirstTable] ON [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id
小结
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
--right join
SELECT * FROM [MyPractice].[dbo].[SecondTable] left join [MyPractice].[dbo].[FirstTable] ON [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id
小结
right join: 即使左表中没有匹配,也从右表返回所有的行。
Full join
SELECT * FROM [MyPractice].[dbo].[FirstTable]
full join [MyPractice].[dbo].[SecondTable] ON [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id
--full join
SELECT * FROM [MyPractice].[dbo].[SecondTable] full join [MyPractice].[dbo].[FirstTable] ON [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id
小结
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
--inner join
SELECT * FROM [MyPractice].[dbo].[SecondTable] inner join [MyPractice].[dbo].[FirstTable] ON [MyPractice].[dbo].[FirstTable].p_id=[MyPractice].[dbo].[SecondTable].id
小结
Inner join:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
Inner join 与 JOIN 是相同的。
总结完毕,欢迎指正!