Joins in SQL - Inner, Outer, Left and Right

Join是SQL中一个很是基本的概念,有时会让人感到困惑。当咱们须要找到涉及多个表的属性的查询时,使用联接,这些表具备至少一个共同的属性。所以,Join 的须要自己就很是清楚。存在用于不一样目的的不一样类型的链接。原文html

在SQL中 Joins

假设咱们有两个表,一个名为STUDENT的表,另外一个名为TEACHER的表。sql

第一个表“STUDENT": 学生的参考详细信息,第二个表“TEACHER": 学校教师和课程的详细信息。ide

STUDENTui

ClassID Name House address
101 拉杰 xyz
201 Varun byc
301 Chittiz abc
401 赫马 def

TEACHERcode

Teacher id Class name ClassID
1 首先 101
2 第二 201
3 第三 301
4 第四 401

在第二个表中,“ClassID"是一个外键,用做第二个表中第一个表的引用。cdn

如今,若是咱们想要查找教师ID为1;的学生的姓名,咱们须要找到上述表格的链接,由于它要求咱们收集两个表格的信息。所以,仅在两个表都具备至少一个共同属性(此处为ClassID)的状况下才使用链接,而且咱们须要找到涉及两个表的属性的查询的解决方案。htm

Join的类型

基本上有四种类型的链接,即Inner, Outer, Left and Right Join。每一个提到的链接的解释以下。对象

Joins in SQL - Inner, Outer, Left and Right Join

一、Inner Join

让咱们考虑如下两个表,第一个表的名称是Country(保存不一样国家的id),另外一个表的名称是State(保存这些国家/地区的各类状态)。blog

COUNTRYthree

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

你可能也喜欢:

相关文章
相关标签/搜索