Join是SQL中一个很是基本的概念,有时会让人感到困惑。当咱们须要找到涉及多个表的属性的查询时,使用联接,这些表具备至少一个共同的属性。所以,Join 的须要自己就很是清楚。存在用于不一样目的的不一样类型的链接。原文html
假设咱们有两个表,一个名为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
基本上有四种类型的链接,即Inner, Outer, Left and Right 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 |
另外一方面, 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(空)。
另外一方面,左链接(或左外链接)显示两个表中共有的数据,以及左表(仅排除)中存在的数据。
这基本上意味着整个左表的数据将在应用左链接时显示。
若是左表中没有匹配项,则显示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(空)
顾名思义,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链接相关的查询,请在下面注释。