Joins in SQL - Inner, Outer, Left and Right

986 阅读5分钟

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连接相关的查询,请在下面注释。

你可能也喜欢: