Joins in SQL - Inner, Outer, Left and Right
Join是SQL中一个非常基本的概念,有时会让人感到困惑。当我们需要找到涉及多个表的属性的查询时,使用联接,这些表具有至少一个共同的属性。因此,Join 的需要本身就非常清楚。存在用于不同目的的不同类型的连接。原文
在SQL中 Joins
假设我们有两个表,一个名为STUDENT的表,另一个名为TEACHER的表。
第一个表“STUDENT": 学生的参考详细信息,第二个表“TEACHER": 学校教师和课程的详细信息。
STUDENT
ClassID | Name | House address |
---|---|---|
101 | 拉杰 | xyz |
201 | Varun | byc |
301 | Chittiz | abc |
401 | 赫马 | def |
TEACHER
Teacher id | Class name | ClassID |
---|---|---|
1 | 首先 | 101 |
2 | 第二 | 201 |
3 | 第三 | 301 |
4 | 第四 | 401 |
在第二个表中,“ClassID"是一个外键,用作第二个表中第一个表的引用。
现在,如果我们想要查找教师ID为1;的学生的姓名,我们需要找到上述表格的连接,因为它要求我们收集两个表格的信息。因此,仅在两个表都具有至少一个共同属性(此处为ClassID)的情况下才使用连接,并且我们需要找到涉及两个表的属性的查询的解决方案。
Join的类型
基本上有四种类型的连接,即Inner, Outer, Left and Right Join。每个提到的连接的解释如下。
Joins in SQL - Inner, Outer, Left and Right Join
1、Inner Join
让我们考虑以下两个表,第一个表的名称是Country(保存不同国家的id),另一个表的名称是State(保存这些国家/地区的各种状态)。
COUNTRY
CountryId | CountryName |
---|---|
1 | 中国 |
2 | 印度 |
3 | 美国 |
STATE
StateId | CountryId | StateName |
---|---|---|
01 | 2 | GOA |
02 | 2 | RAJASTHAN |
03 | 5 | 加德满都 |
04 | 6 | 伊斯兰堡 |
select * from COUNTRY
inner join STATE
on COUNTRY.CountryId=STATE.CountryId
上面提到的命令在两个表上应用内连接,因为common属性是Country id,我们已经在同一个上应用了连接。
内连接返回两个表中的所有匹配值。这里,在表State中,因为country table中唯一匹配的CountryId值是{CountryId = 2},作为内连接的结果,我们将得到以下结果:
CountryId | CountryName | StateId | StateName |
---|---|---|---|
2 | 印度 | 01 | GOA |
2 | 印度 | 02 | RAJASTHAN |
2. Right Join
另一方面, right (or right outer join) 显示两个表中共有的数据,以及右表(仅排除)中存在的数据。
这基本上意味着整个右表的数据将在应用右连接时显示。
如果左表中没有匹配项,则显示NULL。
Example:
COUNTRY
CountryId | CountryName |
---|---|
1 | 中国 |
2 | 印度 |
3 | 美国 |
STATE
StateId | CountryId | StateName |
---|---|---|
01 | 2 | GOA |
02 | 2 | RAJASTHAN |
03 | 5 | 加德满都 |
04 | 6 | 伊斯兰堡 |
select * from COUNTRY
right join STATE
on COUNTRY.CountryId=STATE.CountryId
上面提到的命令在两个表上应用了右连接,因为公共属性是CountryId;,我们已经在CountryId本身上应用了连接。
右表是我们引用的第二个表。
由于应用了正确的连接,我们会得到下表:
CountryId | CountryName | StateId | StateName |
---|---|---|---|
2 | 印度 | 01 | GOA |
2 | 印度 | 02 | RAJASTHAN |
5 | NULL | 03 | 加德满都 |
6 | NULL | 04 | 伊斯兰堡 |
在结果中,清楚地描述了左表中的值在右对象中绝对没有匹配值的值未被显示。仅显示左表的那些与右对象具有共同属性的值。而右表中的所有值都会显示。右表中没有匹配的行显示为NULL(空)。
3. Left Join
另一方面,左连接(或左外连接)显示两个表中共有的数据,以及左表(仅排除)中存在的数据。
这基本上意味着整个左表的数据将在应用左连接时显示。
如果左表中没有匹配项,则显示NULL。
COUNTRY
CountryId | CountryName |
---|---|
1 | 中国 |
2 | 印度 |
3 | 美国 |
STATE
StateId | CountryId | StateName |
---|---|---|
01 | 2 | GOA |
02 | 2 | RAJASTHAN |
03 | 5 | 加德满都 |
04 | 6 | 伊斯兰堡 |
select * from COUNTRY
left join STATE
on COUNTRY.CountryId =STATE.CountryId
上面提到的命令在两个表上应用了Left Join,因为common属性是CountryId;,我们已经在Countryid本身上应用了连接。
左表是我们引用的第一个表。
关于左连接的应用我们会得到下表:
CountryId | CountryName | Stateid | Statename |
---|---|---|---|
1 | 中国 | NULL | NULL |
2 | 印度 | 01 | GOA |
2 | 印度 | 02 | RAJASTHAN |
3 | 美国 | NULL | NULL |
在结果中,清楚地表明右侧列中没有显示左侧匹配值的值未显示。仅显示右列的那些属性与左侧属性具有共同属性。而左表中的所有值都显示出来。右表中没有匹配的左表中的行显示为NULL(空)
4. Full Outer Join
顾名思义,Full Outer Join显示了两个表的所有内容。 Full Outer Join返回两个表中的所有匹配记录,无论其他表是否匹配。
COUNTRY
CountryId | CountryName |
---|---|
1 | 中国 |
2 | 印度 |
3 | 美国 |
STATE
StateId | CountryId | StateName |
---|---|---|
01 | 2 | GOA |
02 | 2 | RAJASTHAN |
03 | 5 | 加德满都 |
04 | 6 | 加拿大 |
select * from COUNTRY
full outer join STATE
on COUNTRY.CountryId=TEACHER.CountryId
上面提到的命令在两个表上应用了Full Outer Join,因为common属性是CountryId;,我们已经在Countryid本身上应用了连接。
关于Full Outer Join的应用,我们会得到下表:
CountryId | CountryName | Stateid | Statename |
---|---|---|---|
1 | 中国 | NULL | NULL |
2 | 印度 | 01 | GOA |
2 | 印度 | 02 | RAJASTHAN |
3 | 美国 | NULL | NULL |
NULL | NULL | 03 | 加德满都 |
NULL | NULL | 04 | 伊斯兰堡 |
此Join将导致所有行。 当没有匹配时,我们得到NULL(空)。
连接对于使用SQL中的表非常重要,上面描述的内容真正详细说明了每个表的用法。
如果您有任何与SQL连接相关的查询,请在下面注释。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~