Stay hungry,Stay foolish!

0%

Sql Server 连接查询

在操作数据库的时候,经常会使用到inner join,left join,right join,full join。今天用了一个简单的例子记录一下这几个的区别。
database_network_cloud-computing-100752015-large2020-1-2-20-32-41

1 测试数据

为了方便测试,就不用搞那么多复杂的数据了,新建了两张表:Student,Course,分别是学生表和课程表。

sql脚本如下

1
GO
2
/****** Object:  Table [dbo].[Course]    Script Date: 2020/1/2 16:27:58 ******/
3
SET ANSI_NULLS ON
4
GO
5
SET QUOTED_IDENTIFIER ON
6
GO
7
SET ANSI_PADDING ON
8
GO
9
CREATE TABLE [dbo].[Course](
10
	[stuNo] [varchar](50) NULL,
11
	[course] [varchar](50) NULL
12
) ON [PRIMARY]
13
14
GO
15
SET ANSI_PADDING OFF
16
GO
17
/****** Object:  Table [dbo].[Student]    Script Date: 2020/1/2 16:27:58 ******/
18
SET ANSI_NULLS ON
19
GO
20
SET QUOTED_IDENTIFIER ON
21
GO
22
SET ANSI_PADDING ON
23
GO
24
CREATE TABLE [dbo].[Student](
25
	[stuNo] [varchar](50) NULL,
26
	[stuName] [varchar](50) NULL
27
) ON [PRIMARY]
28
29
GO
30
SET ANSI_PADDING OFF
31
GO
32
INSERT [dbo].[Course] ([stuNo], [course]) VALUES (N'003', N'Science')
33
INSERT [dbo].[Course] ([stuNo], [course]) VALUES (N'001', N'Math')
34
INSERT [dbo].[Course] ([stuNo], [course]) VALUES (N'001', N'English')
35
INSERT [dbo].[Course] ([stuNo], [course]) VALUES (N'002', N'English')
36
INSERT [dbo].[Course] ([stuNo], [course]) VALUES (N'005', N'CS')
37
INSERT [dbo].[Student] ([stuNo], [stuName]) VALUES (N'004', N'ChenYuan')
38
INSERT [dbo].[Student] ([stuNo], [stuName]) VALUES (N'001', N'ZhangWei')
39
INSERT [dbo].[Student] ([stuNo], [stuName]) VALUES (N'002', N'HuangHua')
40
INSERT [dbo].[Student] ([stuNo], [stuName]) VALUES (N'003', N'YangYi')

执行结果如下:

1
SELECT  * FROM dbo.Student WITH (NOLOCK) ORDER BY stuNo
2
SELECT  * FROM dbo.Course WITH (NOLOCK)  ORDER BY stuNo

微信图片_202001022033102020-1-2-20-33-49

2 inner join 内连接

inner join是两张表连接查询的时候,只返回这两张表中条件完全匹配的结果。比如执行下面的查询:

1
SELECT  * FROM dbo.Student AS A
2
INNER JOIN dbo.Course AS B
3
ON A.stuNo = B.stuNo
4
ORDER BY A.stuNo

这两张表都有001,002,003的学生学号stuNo。因此查询出来的时候两边只有这三个学号的信息。

微信图片_202001022033222020-1-2-20-34-41

004号在学生表中有数据,但没事在课程表里面没有对应的stuNo = 004,因此不会查询出来。

3 left join 左连接

left join是以以左边的表为基准,返回左边表的所有数据,不管查询条件里面符不符合,都全部显示出来,如果右表没有对应的数据,那就返回NULL。而右边的表只显示ON条件里面的符合的数据。

1
SELECT * FROM dbo.Student AS A
2
LEFT JOIN dbo.Course AS B
3
ON A.stuNo = B.stuNo
4
ORDER BY A.stuNo

这里面的左右是以”left join”为基准的,写在”left join”之前的就是左表,写在”left join”右边的就是右表。

比如这里面”dbo.Student”就是左表,返回它的所有数据。”dbo.Course”就是右表,返回符合条件的数据。查询结果如下:

微信图片_202001022033272020-1-2-20-35-5

“004”在Course表中没有数据,所以course表中的那一项为空。

4 right join 右连接

跟左连接差不多,就是和左连接反过来而已。返回右表的所有数据,即使没有和左表匹配上,返回左表中符合条件的数据。

1
SELECT * FROM dbo.Student AS A
2
RIGHT JOIN dbo.Course AS B
3
ON A.stuNo = B.stuNo

微信图片_202001022033312020-1-2-20-35-22

5 full join 全连接

这个是返回左表和右表所有的行,如果条件符合那就匹配,没有的话就返回NULL。查询结果就是left join和right join的并集。

1
SELECT * FROM dbo.Student AS A
2
FULL JOIN dbo.Course AS B
3
ON A.stuNo = B.stuNo
4
ORDER BY A.stuNo

微信图片_202001022033342020-1-2-20-35-33