绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Sql Server 连接查询
2022-05-31 11:22:49

在操作数据库的时候,经常会使用到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
复制代码

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

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。因此查询出来的时候两边只有这三个学号的信息。

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

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"就是右表,返回符合条件的数据。查询结果如下:

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

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

4 right join 右连接

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

SELECT * FROM dbo.Student AS A
RIGHT JOIN dbo.Course AS B
ON A.stuNo = B.stuNo
复制代码

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

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
复制代码

微信图片_202001022033342020-1-2-20-35-33
原文发于:hjxlog.com/posts/20200…

作者:HuangJianxian
链接:https://juejin.cn/post/6844904037465194510

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Microsoft SQL Server
创建时间:2022-03-30 11:29:11
Microsoft SQL Server
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • itt0918
    专家
戳我,来吐槽~