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。每个提到的连接的解释如下。
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连接相关的查询,请在下面注释。
你可能也喜欢:
- Difference between Primary Key and Foreign Key
- Dynamic SQL in DBMS
- Joining Three or More Tables in SQL
- Difference between SQL and PL/SQL
- Introduction to SQL