Join的连接原理

20 篇文章 0 订阅
订阅专栏

1. 连接简介

1.1 连接的本质

连接就是把各个表中的记录都取出来进行一次匹配,并把匹配后的组合发送给客户端。如果连接查询中的结果集中包含一个表中的每一条记录与另一个表中的每一条记录相互匹配的组合,那么这样的结果集就可以称为笛卡尔积。

1.2 连接过程简介

t1、t2表数据

SELECT * FROM `t1`;
+----+----+
| m1 | n1 |
+----+----+
|  1 | a  |
|  2 | b  |
|  3 | c  |
+----+----+
SELECT * FROM `t2`;
+----+----+
| m1 | n1 |
+----+----+
|  1 | a  |
|  2 | b  |
|  3 | c  |
+----+----+

连接过程:

SELECT * FROM t1, t2 WHERE t1.m1 < 1 AND t1.m1 = t2.m2 AND t2.n2 < 'd';

这个查询中,有3个过滤条件:

  • t1.m1 >1;
  • t1.m1 = t2.m2;
  • t2.n2 < ‘d’
    步骤1:假设使用t1作为驱动表,那么就需要到t1表中查找满足t1.m1 >1的记录。
    在这里插入图片描述
    步骤2:步骤1中从驱动表每获取到一条记录,都需要到t2表中查找匹配的记录。
    在这里插入图片描述

1.3 内连接和外连接

  • 对于内连接和两个表,若驱动表中的记录在被驱动表中找不到匹配的记录,则该记录不会加入到最后的结果集。
  • 对于外连接的两个表,即使驱动表中的记录在被驱动表中没有匹配的记录,也仍然需要加入到结果集。
    • 左外连接:选取左侧的表为驱动表
    • 右外连接:选取右侧的表为驱动表
  • WHERE 子句中的过滤条件
    不论是内连接还是外连接,凡是不符合WHERE子句中过滤条件的记录被不会被加入到最后的结果集。
  • ON 子句中的过滤条件
    如果无法在被驱动表中找到匹配ON子句中过滤条件的记录,那么改驱动表记录仍然会加入到结果集种。
  1. 左连接的语法
    select * from t1 left join t2 on 连接条件 [where 普通过滤条件]
    
  2. 右连接的语法
    select * from t1 right join t2 on 连接条件 [where 普通过滤条件]
    
  3. 内连接的语法
    select * from t1 [INNER | CROSS] t2 on 连接条件 [where 普通过滤条件]
    SELECT * FROM t1 JOIN t2;
    SELECT * FROM t1 INNER JOIN t2;
    SELECT * FROM t1 CROSS JOIN t2;
    

2.连接的原理

2.1 嵌套循环连接

两个表进行内查询的大致过程:

  1. 选取驱动表,使用与驱动表相关的过滤条件,选取代价最低的单表访问方法来执行对驱动表的单表查询。
  2. 对1中查询驱动表得到的结果集中的每一条记录,都分别到被驱动表中查找匹配的记录。
    在这里插入图片描述
    “驱动表只访问一次,单被驱动表却可能访问多次,且访问次数取决对驱动表执行单表查询后的结果集中有多少条记录”的连接执行方式称为嵌套循环连接(Nested-Loop Join)
for each row in t1 satisfying conditions about t1{
	for each row in t2 satisfying conditions about t2{
		for each row in t3 satisfying conditions about t3{
			send to client;
		}
	}
}

2.2 使用索引加快连接速度

SELECT	*	FROM	t1,	t2	WHERE	t1.m1	>	1	AND	t1.m1	=	t2.m2	AND	t2.n2	<	'd';

在这里插入图片描述
可以看到,原来的t1.m1 = t2.m2这个涉及两个表的过滤条件在针对t2表做查询时关于t1表的条件就已经确定了,所以我们只需要单单优化对t2表的查询了,上述两个对t2表的查询语句中利⽤到的列是m2和n2列,我们可以:

  • 在m2列上建⽴索引,因为对m2列的条件是等值查找,⽐如t2.m2 = 2、t2.m2 = 3等,所以可能使⽤到ref的访问⽅法,假设使⽤ref的访问⽅法去执⾏对t2表的查询的话,需要回表之后再判断t2.n2 < d这个条件是否成⽴。
    这⾥有⼀个⽐较特殊的情况,就是假设m2列是t2表的主键或者唯⼀⼆级索引列,那么使⽤t2.m2 = 常数值这样的条件从t2表中查找记录的过程的代价就是常数级别的。我们知道在单表中使⽤主键值或者唯⼀⼆级索引列的值进⾏等值查找的⽅式称之为const,⽽设计MySQL的⼤叔把在连接查询中对被驱动表使⽤主键值或者唯⼀⼆级索引列的值进⾏等值查找的查询执⾏⽅式称之为:eq_ref。
  • 在n2列上建⽴索引,涉及到的条件是t2.n2 < ‘d’,可能⽤到range的访问⽅法,假设使⽤range的访问⽅法对t2表的查询的话,需要回表之后再判断在m2
    列上的条件是否成⽴。

2.3 基于块的嵌套循环连接(Block Nested-Loop Join)

被驱动表中的数据特别多⽽且不能使⽤索引进⾏访问,那就相当于要从磁盘上读好⼏次这个表,这个I/O代价就⾮常⼤了,所以我们得想办法:尽量减少访问被驱动表的次数。
join buffer的概念,join buffer就是执⾏连接查询前申请的⼀块固定⼤⼩的内存,先把若⼲条驱动表结果集中的记录(查询的字段以及需要过滤的字段信息)装在这个join buffer中,然后开始扫描被驱动表,每⼀条被驱动表的记录⼀次性和join buffer中的多条驱动表记录做匹配,因为匹配的过程都是在内存中完成的,所以这样可以显著减少被驱动表的I/O代价。
在这里插入图片描述

Mysql连接join查询原理知识点
12-16
3、连接查询基本形式: from 表1 【连接方式】 join 表2 【on连接条件】连接查询基本形式: from 表1 【连接方式】 join 表2 【on连接条件】 1、连接查询的分类 交叉连接 其实就是两个表之间按连接的基本概念,...
JOIN连接用法
weixin_44602460的博客
01-29 2602
1.INNER JOIN 内部链接 INNER JOIN 关键字选择两个表中具有匹配值的记录。 INNER JOIN 语法: *SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;* 注释:INNER JOINJOIN 是相同的,上面的示例就是 INNER JOIN. ![](https://img-blog.csdnimg.cn/2021012909311434
数据库学习-连接/join
m0_37155951的博客
08-04 1046
数据库连接在我看来就是通过连接将两个表的合成一个新的表 连接/join有四种方式,内连接-inner join,左连接-left join,右连接-right join,全连接-full join。 1.内连接-inner join:在SQL中,inner join等同于join,将两个表根据某一列的交集进行合成,若两个表的对应列无交集,则合成结果为空 2.左连接-left join:以左表为基础,将右表中对应列符合条件的行附在左表上,合成一个新表,若右表中没有对应的行匹配,则置新表的对应值为空。l
join连接的五种方式的简单使用案例(Inner join,Left join,Right join,Full join,Cross join
热门推荐
u013412790的专栏
06-10 1万+
1.内连接Inner join连接是基于连接谓词将俩张表(如A和B)的列组合到一起产生新的结果表 ,在表中存在至少一个匹配时,INNER JOIN 关键字返回行。 下面是一个简单的使用案例 以下是运行代码及结果 2.左外连接Left join左外连接Left join关键字会从左表那里返回所有的行,即使是在右表中没有匹配到的行 下面是一个简单的案例
Join连接
追求卓越,做到专业
10-28 1274
Join连接 创建表 create table students ( SID varchar(4) not null primary key, NAME varchar(30), AGE int, CLASSID varchar(3) ); create table classes ( CLASSID varchar(3) not null primary key,
MySQL连接查询(JOIN 关键字)—— 图文详解:内连接(INNER JOIN)、外连接(OUTER JOIN)、左连接(LEFT JOIN)、左外连接、右连接、右外连接、全连接、全外连接
最新发布
我梦
05-07 5124
MySQL连接查询(JOIN 关键字)—— 图解:内连接(INNER JOIN)、等值连接、自然连接(NATURAL JOIN)、交叉连接、外连接(OUTER JOIN)、左连接(LEFT JOIN)、左外连接(LEFT OUTER JOIN)、右连接(RIGHT JOIN)、右外连接(RIGHT OUTER JOIN)、全连接、全外连接
Python join()函数原理及使用方法
12-16
在Python编程语言中,`join()`函数是一种非常实用的字符串操作方法,主要用于将序列(如列表、元组或字符串)中的元素连接成一个新的字符串。它允许我们以自定义的分隔符来组合这些元素,使得数据的展示和处理更加...
hash join 原理和算法
03-21
**二、Hash Join原理** 在实际操作中,Oracle使用哈希函数对连接键进行运算,将数据分到不同的分区。例如,通过求余函数(Mod(join_column_value,10))将数据分到10个分区。这样,只需处理匹配的分区对,减少不必要...
MySQL JOIN 工作原理浅析1
08-03
本文将对 MySQL 中的 JOIN 工作原理进行浅析,包括 Nested Loop Join 和 Hash Join 两种连接算法的工作原理、优缺点及应用场景。 1. Nested Loop Join Nested Loop Join 是一种基于循环的连接算法,工作原理如图所...
JOIN连接
Metakazu的博客
10-24 173
可以视为 前面已经连接完成,形成一个新的大表,其中拥有两个表的全部属性,再与第三个表连接的时候,可以用之前两个表的任意一个属性,与表三匹配。二表连接,只要修改一个引用表,就会起到连带效果。用on来连接两个表的相同部分 结合条件。
深入剖析SQL JOIN原理,助你掌握数据连接的奥秘!
孤芳不自赏
06-06 887
这篇文章你值得一阅!讲技术我觉得应该让外行也能看明白,而不是一堆专业术语堆砌,像在读天书一般,到最后感觉云里雾里。
JOIN语句的底层原理
LMGD的博客
03-18 1554
数据初始化 create table a(f1 int,f2 int ,INDEX(f1)); create table b(f1 int,f2 int); insert into a VALUES(1,1),(2,2),(3,3),(4,4),(5,5),(6,6); insert into b VALUES(3,3),(4,4),(5,5),(6,6),(7,7),(8,8);
MapReduce编程小案例.9th—join算法
RobertDowneyLm的博客
05-16 2530
MapReduce编程小案例.9th—join算法数据:有订单数据:order001,u001 order002,u001 order003,u005 order004,u002 order005,u003 order006,u004  有用户数据:u001,senge,18,angelababy u002,laozhao,48,ruhua u003,xiaoxu,16,chunge...
MySQL中的Join连接查询
BlueProtocolBlog
03-04 2434
我们在进行表连接查询的时候一般都会使用JOIN xxx ON xxx的语法,ON语句的执行是在JOIN语句之前的,也就是说两张表数据行之间进行匹配的时候,会先判断数据行是否符合ON语句后面的条件,再决定是否JOIN,对参与 Join 操作的基表或视图进行过滤,之后再对两表进行 Join 操作,输出结果集。对于三表或多表 Join,则都是可以拆分为两表 Join 的方式进行处理,最先参与 Join 操作的两个表的 Join 的结果集,以表的形式参与后续的 Join 操作。我们来举个例子来简单理解笛卡尔积。
【并发基础】join()方法底层原理详解
小七的博客
03-16 3643
详细讲解Thread类中join()方法实现线程的强制执行,通过底层源码深入了解方法原理,彻底了解join方法的运作机制。
案例-使用MapReduce实现join操作
喜讯XiCent 的博客
09-15 2481
哈喽~各位小伙伴们中秋快乐,好久没更新新的文章啦,今天分享如何使用mapreduce进行join操作。 在离线计算中,我们常常不只是会对单一一个文件进行操作,进行需要进行两个或多个文件关联出更多数据,类似与sql中的join操作。今天就跟大家分享一下如何在MapReduce中实现join操作 需求 现有两张,一张是产品信息表,一张是订单表。订单表中只表存了产品ID,如果想要查出订...
MySQLJOIN连接实现算法
Eucalyptus's blog
05-07 1608
我们都知道SQLjoin关联表的使用方式,但是这次聊的是实现join的算法,join有三种算法,分别是Nested Loop Join,Hash join,Sort Merge Join
JOIN语句原理
main_Scanner01的博客
03-28 1588
JOIN语句原理 join方式连接多个表,本质就是各个表之间数据的循环匹配。MySQL5.5版本之前,MySQL只支持一种表间关联方式,就是嵌套循环(Nested Loop Join)。如果关联表的数据量很大,则join关联的执行时间会非常长。在MySQL5.5以后的版本中,MySQL通过引入BNLJ算法来优化嵌套执行。 驱动表和被驱动表 驱动表就是主表,被驱动表就是从表、非驱动表 SELECT * FROM A JOIN B ON ... A一定是驱动表吗?不一定,优化器会根据你查询语句做优化,决定先查
MySQL】七种JOIN连接详解
offer!
05-06 1万+
1.内连接连接查询出的数据是两张表的交集,即上图中红色所表示的部分。 2.左外连接 左外链接如图中红色部分的内容,即包含左边表的全部行(不管右边的表中是否存在与它匹配的行),和右边表中全部匹配的行。 3.右外链接 右外链接如图中红色部分的内容,即包含右边表的全部行(不管左边的表中是否存在与它匹配的行),和左边表中全部匹配行。 4.左连接连接如图中红色部分的内容,...
mysql join底层原理
09-17
MySQL中,JOIN操作的底层原理可以通过以下几种方式来实现:简单嵌套循环连接(Simple Nested-Loop Join)、索引嵌套循环连接(Index Nested-Loop Join)和快嵌套循环连接(Block Nested-Loop Join)等。...
写文章

热门文章

  • Redis 读写分离 使用redisTemplate执行lua脚本时,报错处理 2155
  • git保存仓库的账号密码 1204
  • Join的连接原理 1197
  • 将存放在gitee上项目,通过jenkins使用docker推送到阿里云私服上,并控制远程部署到其他服务 1106
  • Ubuntu 安装Java、Git、maven、Jenkins等持续集成环境 1067

分类专栏

  • Maven 2篇
  • springcloub 1篇
  • sentinel 1篇
  • Docker 4篇
  • CI/CD 3篇
  • nacos 2篇
  • Java基础 13篇
  • 分布式 1篇
  • Redis 19篇
  • wsl 1篇
  • 多线程 3篇
  • Mysql 20篇
  • JVM 1篇
  • spring 2篇
  • Tomcat 1篇
  • Excel读写 1篇
  • oracle 1篇
  • bat 2篇
  • JDK 1篇
  • protoc 1篇
  • RabbitMQ安装 1篇
  • Kafka 1篇
  • npm

最新评论

  • Docker 从0安装 nacos集群

    CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天值得看】榜单,全部的排名请看 https://bbs.csdn.net/topics/618258092。

  • MySQL redo log、undo log、binlog

    CSDN-Ada助手: 一定要坚持创作更多高质量博客哦, 小小红包, 以资鼓励, 更多创作活动请看: 【端午福利】争夺博客之星半程领骑手,赢端午礼包: https://activity.csdn.net/creatActivity?id=10462?utm_source=csdn_ai_ada_redpacket 毕业季征文·未来可期: https://activity.csdn.net/creatActivity?id=10429?utm_source=csdn_ai_ada_redpacket 令人惊艳的算法分享!: https://activity.csdn.net/creatActivity?id=10455?utm_source=csdn_ai_ada_redpacket 全部创作活动: https://mp.csdn.net/mp_blog/manage/creative?utm_source=csdn_ai_ada_redpacket

  • Tomcat 学习

    m0_69382521: 博主的技术面很广哦,小菜鸟求带,可以加你微信随时和您交流吗

  • Maven私服

    ctotalk: thanks,欢迎关注一起交流

  • Docker安装RabbitMQ

    向彪-blockchain: 文章很赞,作者辛苦了!方便的话可以加个关注。共同学习!一起进步!

大家在看

  • 百度文库ai辅助写小说之AI自主创作小说
  • c++文件写入和读取
  • 10108-机械手柔性生产线物料分拣控制系统设计(说明书+设计资料源文件+运行软件+PLC组态王仿真+PPT) 功能描述: 机械手臂的应用主要是由内部执行机构驱动器以及内部电气控制设备组合而成。通过 525
  • 2.C语言常见概念(下)
  • vivado 采用 HBM 器件进行设计

最新文章

  • maven 说明信息
  • 使用docker部署sentinel并融合到springcloub中
  • Java8 Stream
2024年11篇
2023年27篇
2022年4篇
2021年14篇
2020年27篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家洛阳铜玻璃钢景观雕塑加工广东商场节庆美陈雕塑厂家烟台火烈鸟玻璃钢雕塑定制滁州公园玻璃钢雕塑家居商场美陈图片博乐气球商场美陈装饰哪里靠谱铜陵商场开业美陈河南玻璃钢雕塑定制设计佛山玻璃钢抽象鹿雕塑广东走廊商场美陈批发价玻璃钢雕塑制作难吗广东大型商场美陈生产厂家河东玻璃钢花盆丹阳玻璃钢雕塑收费标准公园摆件玻璃钢卡通雕塑费用惠州玻璃钢雕塑规定上饶玻璃钢雕塑供应商重庆动物玻璃钢雕塑哪家便宜湖南玻璃钢雕塑定制价格江门玻璃钢雕塑生产南京节庆商场美陈标识标牌玻璃钢人物雕塑小品新乡玻璃钢动物雕塑价位宜昌户外玻璃钢雕塑批发青岛商场美陈多少钱石家庄佛像玻璃钢雕塑设计公司安徽玻璃钢商城广场美陈雕塑厂家南京玻璃钢雕塑定做厂家浅白色石漆玻璃钢花盆价格洛阳抽象玻璃钢卡通雕塑定制香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化