在操作数据库的时候,经常会使用到inner join,left join,right join,full join。今天用了一个简单的例子记录一下这几个的区别。
1 测试数据
为了方便测试,就不用搞那么多复杂的数据了,新建了两张表:Student,Course,分别是学生表和课程表。
sql脚本如下
GO
/****** Object: Table [dbo].[Course] Script Date: 2020/1/2 16:27:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Course](
[stuNo] [varchar](50) NULL,
[course] [varchar](50) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[Student] Script Date: 2020/1/2 16:27:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Student](
[stuNo] [varchar](50) NULL,
[stuName] [varchar](50) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[Course] ([stuNo], [course]) VALUES (N'003', N'Science')
INSERT [dbo].[Course] ([stuNo], [course]) VALUES (N'001', N'Math')
INSERT [dbo].[Course] ([stuNo], [course]) VALUES (N'001', N'English')
INSERT [dbo].[Course] ([stuNo], [course]) VALUES (N'002', N'English')
INSERT [dbo].[Course] ([stuNo], [course]) VALUES (N'005', N'CS')
INSERT [dbo].[Student] ([stuNo], [stuName]) VALUES (N'004', N'ChenYuan')
INSERT [dbo].[Student] ([stuNo], [stuName]) VALUES (N'001', N'ZhangWei')
INSERT [dbo].[Student] ([stuNo], [stuName]) VALUES (N'002', N'HuangHua')
INSERT [dbo].[Student] ([stuNo], [stuName]) VALUES (N'003', N'YangYi')
复制代码
执行结果如下:
SELECT * FROM dbo.Student WITH (NOLOCK) ORDER BY stuNo
SELECT * FROM dbo.Course WITH (NOLOCK) ORDER BY stuNo
复制代码
2 inner join 内连接
inner join是两张表连接查询的时候,只返回这两张表中条件完全匹配的结果。比如执行下面的查询:
SELECT * FROM dbo.Student AS A
INNER JOIN dbo.Course AS B
ON A.stuNo = B.stuNo
ORDER BY A.stuNo
复制代码
这两张表都有001,002,003的学生学号stuNo。因此查询出来的时候两边只有这三个学号的信息。
004号在学生表中有数据,但没事在课程表里面没有对应的stuNo = 004,因此不会查询出来。
3 left join 左连接
left join是以以左边的表为基准,返回左边表的所有数据,不管查询条件里面符不符合,都全部显示出来,如果右表没有对应的数据,那就返回NULL。而右边的表只显示ON条件里面的符合的数据。
SELECT * FROM dbo.Student AS A
LEFT JOIN dbo.Course AS B
ON A.stuNo = B.stuNo
ORDER BY A.stuNo
复制代码
这里面的左右是以"left join"为基准的,写在"left join"之前的就是左表,写在"left join"右边的就是右表。
比如这里面"dbo.Student"就是左表,返回它的所有数据。"dbo.Course"就是右表,返回符合条件的数据。查询结果如下:
“004”在Course表中没有数据,所以course表中的那一项为空。
4 right join 右连接
跟左连接差不多,就是和左连接反过来而已。返回右表的所有数据,即使没有和左表匹配上,返回左表中符合条件的数据。
SELECT * FROM dbo.Student AS A
RIGHT JOIN dbo.Course AS B
ON A.stuNo = B.stuNo
复制代码
5 full join 全连接
这个是返回左表和右表所有的行,如果条件符合那就匹配,没有的话就返回NULL。查询结果就是left join和right join的并集。
SELECT * FROM dbo.Student AS A
FULL JOIN dbo.Course AS B
ON A.stuNo = B.stuNo
ORDER BY A.stuNo
复制代码
原文发于:hjxlog.com/posts/20200…作者:HuangJianxian
链接:https://juejin.cn/post/6844904037465194510