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


原文发于:https://hjxlog.com/posts/20200102a1.html

Sql Server 连接查询相关推荐

  1. SQL server连接查询

    目录 前沿小补充 等值与非等值连接查询 自身连接 外连接 多表连接 前沿小补充 例3.48 查询平均成绩大于等于80分的学生学号和平均成绩 SELECT Sno,AVG(Grade) FROM SC ...

  2. SQL Server 连接查询(多表连接查询)

    多表连接查询 1.查询的信息来源于多张表,则可以通过两两相连的方式建立多表连接查询 以下是正常多表查询语法,查询三张表的所有数据信息 2.简单多表查询要比多表查询写法更简单,效果是一样的, 简单多表查 ...

  3. SQL Server 连接查询(内连接查询)

    内连接查询 1.内连接基于连接谓词on,它将两张表的列组合在一起,产生新的结果表 两个表的每一行连接列进行比较,如果满足连接谓词则会组合成一行数据 2.要想进行内连接查询,就必须有连接列,这样才能建立 ...

  4. mysql不同服务器查询_实战操作SQL Server连接查询不同服务器表数据

    今日产品部要导批数据,但是需要连接查询查询的几个表不在同一服务器上.所以我开始是这么干的: 1.查询一台服务器的数据,并导入本地Excel 2.查询另一台服务器的数据,并导入本地Excel 3.Exc ...

  5. 数据库-SQL Server数据库查询速度慢(连接超时)原因及优化方法

    SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列 ...

  6. SQL错误提示档案(3):SQL Server连接中的四个最常见错误

    SQL   Server连接中的四个最常见错误:         一."SQL   Server   不存在或访问被拒绝"          一般说来,有以下几种可能性:     ...

  7. 优化SQL Server数据库查询方法

    本文详细介绍了优化SQL Server数据库查询方法. SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) ...

  8. SQL Server 2005查询处理结构-用户模式计划(UMS)

    SQL Server 2005查询处理结构-用户模式计划(UMS) 在对数据库进行性能调优时,必须全面的考虑各种可能造成系统性能瓶颈的各种因素,因此深入了解SQL Server 2005的查询处理机构 ...

  9. 用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联

    message: 用户 'sa' 登录失败.原因: 未与信任 SQL Server 连接相关联.这个问题该如何解决?=============一.控制面板->服务->MS SQL SERV ...

最新文章

  1. python教学视频下载-董付国老师Python精品教学,视频教程下载
  2. 错误602,未能在sysindexes中找到数据库 的解决办法
  3. 如何理解ScanDef的概念
  4. 看文艺青年怎么玩微信客户端
  5. oracle节点1关闭节点2的集群,[Oracle] Oracle两个节点分裂,识别不到对方节点的状态...
  6. JavaEE基础(05):过滤器、监听器、拦截器,应用详解
  7. 笨办法学 Python · 续 第三部分:数据结构
  8. C++ STL vector容器的插入和删除
  9. 在web服务器启动时: java.util.zip.ZipException: error in opening zip file
  10. UbuntuSkills
  11. 国密SM2/SM3算法
  12. 基于卷积神经网络的人脸识别
  13. Python常用模块-20个常用模块总结
  14. 数据分析师面试题目_数据分析师常见的10道面试题解答
  15. DH(Diffie-Hellman)算法本元根(原根)求法
  16. 再谈BOM和DOM(1):BOM与DOM概述
  17. SQL练习题共50道附答案(MySQL)
  18. Python入门学习笔记——12.文件操作
  19. NdisFilter驱动数据全部转发到应用层的性能之优化(使用共享环形队列方式)
  20. littlevgl之cont 控件(容器控件)

热门文章

  1. DNS协议、ICMP协议、NAT技术
  2. opengl对三种光源(方向光,点光源,聚光灯)进行特写并分屏渲染
  3. locust-分布式部署-分布式性能压测
  4. X240S 装Win7 Bios 设置
  5. 【笔记】Python学习(廖雪峰)笔记①——Python基础知识
  6. 5.cisco思科模拟器ipv4和ipv6编址题目练习
  7. Python小菜鸟-----文本进度条的不同设计函数
  8. 全球及中国建筑节能行业十四五发展态势及产值规模预测报告2021-2027年
  9. Mysql数据库之增删改查(软件测试数据库面试题)
  10. Premiere 4 - 源监视器操作