天涯论坛

 找回密码
 立即注册
搜索
查看: 69|回复: 9

浅析Sql中内连接、外连接、全连接、交叉连接的区别

[复制链接]

3044

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109056
发表于 2024-8-4 09:33:27 | 显示全部楼层 |阅读模式

外连接(out join)

外连接分为外左连接(left outer join)和外右连接(right outer join)

注释:left outer join 与 left join 等价, 通常写成left join right outer join 与 right join等价,通常写成right join

左连接,取左边的表的所有,右边的表按要求,符合的表示,不符合则表示null

举例:select <select list> from A left join B on A.id=B.id

右连接:取右边的表的所有,左边的表按要求,符合的表示,不符合则表示null

举例:select <select list> from A right join B on A.id=B.id

内连接(inner join)

内连接:叫作为等值连接,返回两张表都满足要求的部分

注释:inner join 就等于 join

必须C/C++ Linux服务器架构师学习资料私信“资料”(资料包含C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒介,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

交叉连接(CROSS JOIN)

交叉连接:返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接叫作作笛卡尔积

首要,先简单解释一下笛卡尔积:笛卡尔乘积指的是在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又叫作直积,暗示为X × Y,第1个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员

举例:

此刻咱们有两个集合A和B。

A = {0,1} B = {2,3,4}

集合 A×B 和 B×A的结果集就能够分别暗示为以下这种形式:

A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};

B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};

以上A×B和B×A的结果就能够叫做两个集合相乘的‘笛卡尔积’。

从以上的数据分析咱们能够得出以下两点结论:

1,两个集合相乘,不满足交换率,既 A×B ≠ B×A;

2,A集合和B集合相乘,包括了集合A中元素和集合B中元素相结合的所有的可能性。既两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数;

交叉连接有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,叫笛卡尔积。例如:下面的语句1和语句2的结果是相同的。

语句1:隐式的交叉连接,CROSS JOIN。SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAMEFROM ORDERS O , CUSTOMERS CWHERE O.ID=1;

语句2:显式的交叉连接,运用CROSS JOIN。SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM ORDERS O CROSS JOIN CUSTOMERS CWHERE O.ID=1;

内连接和where的区别:

数据库表连接数据行匹配时所遵循的算法便是以上说到的笛卡尔积,表与表之间的连接能够看成是在做乘法运算。

例如此刻数据库中有两张表,student表和 student_subject表,如下所示:

咱们执行以下的sql语句,只是纯粹的进行表连接。

SELECT * from student JOIN student_subject; SELECT * fromstudent_subjectJOIN student;

看一下执行结果:

表1.0 

表1.1

                             从执行结果上来看,结果符合咱们以上提出的两点结论(红线标注部分);

第1条sql语句为例咱们来看一下他的执行流程,

1,from语句把student表 和 student_subject表从数据库文件加载到内存中。

2,join语句相当于对两张表做了乘法运算,把student表中的每一行记录根据次序和student_subject表中记录依次匹配。

3,匹配完成后,咱们得到了一张有 (student中记录数 × student_subject表中记录数)条的临时表。 在内存中形成的临时表如表1.0所示。咱们又把内存中表1.0所示的表叫作为‘笛卡尔积表’。

再看一下sql中重点关键字的执行次序

from on join where group by having select distinct union order by

咱们看到on是在join和where前面的

倘若两张表的数据量都比很强的话,那样就会占用很大的内存空间这显然是不恰当的。因此咱们在进行表连接查找的时候通常都会运用JOIN xxx ON xxx的语法,ON语句的执行是在JOIN语句之前的,便是说两张表数据行之间进行匹配的时候,会先判断数据行是不是符合ON语句后面的要求,再决定是不是JOIN。

因此呢,有一个显而易见的SQL优化的方法是,当两张表的数据量比较大,又必须连接查找时,应该运用 FROM table1 JOIN table2 ON xxx的语法,避免运用 FROM table1,table2 WHERE xxx 的语法,由于后者会在内存中先生成一张数据量比很强的笛卡尔积表,增多了内存的开销。

全连接(Full join)

全外连接是在结果中除了显示满足连接的要求的行外,还表示了join两侧表中所有满足检索要求的行





上一篇:SEO技巧:怎么样利用内部链接加强整站权威度?
下一篇:详解区分内连接、左连接、外连接、union、union all等sql连接
回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-8-23 13:19:14 | 显示全部楼层
认真阅读了楼主的帖子,非常有益。
回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-8-24 13:44:36 | 显示全部楼层
论坛外链网  http://www.fok120.com/
回复

使用道具 举报

1

主题

548

回帖

-3

积分

限制会员

积分
-3
发表于 2024-9-7 23:07:34 | 显示全部楼层
你的见解独到,让我受益匪浅,非常感谢。
回复

使用道具 举报

3068

主题

2万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99138956
发表于 2024-10-4 01:18:14 | 显示全部楼层
楼主继续加油啊!外链论坛加油!
回复

使用道具 举报

3044

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109056
 楼主| 发表于 2024-10-14 19:49:03 | 显示全部楼层
楼主节操掉了,还不快捡起来!
回复

使用道具 举报

3068

主题

2万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99138956
发表于 2024-10-31 12:42:26 | 显示全部楼层
论坛的成果是显著的,但我们不能因为成绩而沾沾自喜。
回复

使用道具 举报

2942

主题

2万

回帖

9997万

积分

论坛元老

Rank: 8Rank: 8

积分
99979441
发表于 2024-11-2 09:54:05 | 显示全部楼层
论坛的成功是建立在我们诚恳、务实、高效、创新和团结合作基础上,我们要把这种精神传递下去。
回复

使用道具 举报

3044

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109056
 楼主| 发表于 2024-11-5 08:46:29 | 显示全部楼层
楼主听话,多发外链好处多,快到碗里来!外链论坛 http://www.fok120.com/
回复

使用道具 举报

3067

主题

3万

回帖

9915万

积分

论坛元老

Rank: 8Rank: 8

积分
99158943
发表于 2024-11-7 18:22:50 | 显示全部楼层
楼主听话,多发外链好处多,快到碗里来!外链论坛 http://www.fok120.com/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-22 12:29 , Processed in 0.126412 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.