理解内连接和外连接 引用
在实际项目中对数据库进行查询是再常见不过的东西了,但是根据不同的条件查询所用的语句也是千差万别的,最常见的便是数据库中多表之间的联合查询。说到联合查询就不得不提一下查询语句中的表连接关系。我们所用的多表查询语句中表间关系无非有两种,一种为内连接(inner join),另一种为外连接(outer join)。具体细分一下外连接又可分为:左外连接(left join)、右外连接(right join)、全连接(full join),另外还常见的形式有left outer join,right outer join,full outer join。他们之间的具体关系可以下图简单表示:
最近在做系统的过程中用到了不同的查询方式,这里简单总结一下:
首先要说明的是外连接中outer与非outer之间的关系。很多人都使用过left outer join或者是left join,但是多数人没有想过这两者之间究竟有没有区别。很不幸的告诉大家left outer join和left join之间其实是没有本质区别的,outer只是left join的一个属性,outer的存在只是显示的给出了left join的属性,如果没有的话默认的属性也是为outer的,他们两个在查询结果的实现上是没有区别的,right join与right outer join以及full join与full outer join之间的关系也是如此,所以在此我们只介绍inner join、left join、right join和full join四种关系即可。
一、对比理解inner join和 full join
对这两个连接关系的理解我们可以借助于数学上的交并集。Inner join也就是内连接,要求的是多表之间必须同时都满足两表之间的对接条件才能查出结果,也就是说按照对接关系(即on条件)查出的结果必须是多表之间的交集,不满足on条件将会被过滤掉,可以理解为数学上的add条件。Out join与inner join却恰恰相反,它所查出来的结果是两表各自按条件查询结果的并集,outer join的存在,相当于数学上的or条件。
二、对比理解left join和right join
Left join和right join最大的区别在于它确定了以哪个表为查询结果基准。Left join确定以左边表为基准,也就是join字符前的那张表,而right join确定以右边表为基准,即join字符后的那张表。进行查询时首先按照基准表的查询结果确定记录条数然后再根据条件查询非基准表。具体用法以下例说明:
表一:TableOne(别名为TO)
ID |
A |
B |
C |
1 |
A1 |
B1 |
C1 |
2 |
A2 |
B2 |
C2 |
3 |
A3 |
B3 |
C3 |
表二:TableTwo(别名为TT)
ID |
D |
E |
1 |
D1 |
E1 |
2 |
D2 |
E2 |
4 |
D4 |
E4 |
请注意两表中的ID号的区别。
Inner join:
Select TO.A , TO.B , TT.D , TT.E fromTableOne TO inner join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A |
B |
D |
E |
A1 |
B1 |
D1 |
E1 |
A2 |
B2 |
D2 |
E2 |
Left join:
Select TO.A , TO.B , TT.D ,TT.E fromTableOne TO left join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A |
B |
D |
E |
A1 |
B1 |
D1 |
E1 |
A2 |
B2 |
D2 |
E2 |
A3 |
B3 |
NULL |
NULL |
Right join:
Select TO.A , TO.B , TT.D ,TT.E fromTableOne TO right join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A |
B |
D |
E |
A1 |
B1 |
D1 |
E1 |
A2 |
B2 |
D2 |
E2 |
NULL |
NULL |
D4 |
E4 |
Full join:
Select TO.A , TO.B , TT.D ,TT.E fromTableOne TO full join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A |
B |
D |
E |
A1 |
B1 |
D1 |
E1 |
A2 |
B2 |
D2 |
E2 |
A3 |
B3 |
NULL |
NULL |
NULL |
NULL |
D4 |
E4 |
引文:https://www.geek-share.com/detail/2555211381.html
转载于:https://www.cnblogs.com/nzbbody/archive/2012/08/10/2631579.html
- 理解内连接和外连接 引用
- html5三种引用方式 a标签得连接方式 以及表格的基本使用
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
- 对池化层、ReLU函数、全连接层的理解
- 深入理解JavaScript的值传递和引用传递
- 左连接、右连接、外连接、内连接、自连接的理解
- 数据库三范式的理解(引用其他网友)
- 深入理解php原理之变量分离/引用
- 函数形参为指针和引用类型的传递理解
- C#值类型和引用类型的深入理解
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
- GIT | GIT中指针和引用的理解
- 从底层汇编理解 c++ 引用实现机制 (转+增加)
- php中引用&的真正理解-变量引用、函数引用、对象引用
- MySQL left join 左连接的通俗理解
- 理解C#值类型与引用类型
- 基本类型和引用类型值传递的理解
- 我的mqtt协议和emqttd开源项目个人理解(12) - Hook使用和连接Kafka发送消息,使用ekaf库
- 使用SQLCONNECTION连接datasnap服务器时,需要引用DbxCompressionFilter单元 不然会报错argument out of range
- 深入理解父类变量引用子类对象