MySQL中JOIN连接的基本用法实例


Posted in MySQL onJune 05, 2022

join流程详解

join 是指 将两个表连接起来,两个表分别为 驱动表 和 被驱动表。

我们拿下面的这个sql举例,

select t1.id,t2.id  from t1 inner join t2 on t1.id = t2.id  where t1.id > 10;

t1和t2 都对 id 建立了索引,我们假设 t1 是驱动表,t2是被驱动表。

join流程如下:

1、MySQL每次从t1中读取一行满足过滤条件t1.id>10的记录,如果有索引的话,就利用索引快速定位到表t1中符合t1.id>10的记录。如果没有索引的话,就从头到尾遍历,慢慢的查出表t1中符合t1.id>10的记录。

2、当从t1中读取到一条记录r1后,就根据连接的条件,也就是 on关键字后的条件,去t2中对应的t2中的记录,将t1的记录和t2的记录组合返回给客户端.

具体的说就是,当从t1中得到一条记录r1的时候,需要根据连接条件 t1.id = t2.id,也就是去t2中查询是否存在记录r2 ,其中r2.id = r1.id。
也就是执行 select t2.id from t2 where t2.id = r1.id

如果有t2的id有索引的话,那么查询速度是很快的,否则就只能全盘扫描了。

3、就这样,依次的读取t1中符合条件的记录,然后查询t2,直到t1中的记录读取完毕

从上述流程可以看出,join的大致过程就是从驱动表中挨个读取符合条件的记录,然后根据连接条件到被驱动表中找出符合条件的记录,将其组合到一起返回给客户端。

JOIN用于连表查询,主要有5种用法。下面分别演示这5种用法

随便建2张表,结构如下

MySQL中JOIN连接的基本用法实例

MySQL中JOIN连接的基本用法实例

 字段col1用来使两张表有一个同名字段的(但其实没什么用,因为查询条件都需要用ON来指定,这里只是说明一下如果有相同的字段名也没什么影响)

一、笛卡尔积:CROSS JOIN

CROSS JOIN使两张表的所有字段直接进行笛卡尔积,假设表1有m条数据,表2有n条数据,则结果数量为m*n条

SELECT * FROM tab1 CROSS JOIN tab2

结果

MySQL中JOIN连接的基本用法实例

二、内连接:INNER JOIN

内连接需要用ON来指定两张表需要比较的字段,最终结果只显示满足条件的数据

SELECT * FROM tab1 INNER JOIN tab2 ON tab1.id1 = tab2.id2

 结果

MySQL中JOIN连接的基本用法实例

注意到内连接只把满足ON条件的数据相连接,与笛卡尔积不同

三、左连接:LEFT JOIN

左连接可以看做在内连接的基础上,把左表中不满足ON条件的数据也显示出来,但结果中的右表部分中的数据为NULL

SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.id1 = tab2.id2

结果

MySQL中JOIN连接的基本用法实例

四、右连接:RIGHT JOIN

右连接就是与左连接完全相反

SELECT * FROM tab1 RIGHT JOIN tab2 ON tab1.id1 = tab2.id2

结果

MySQL中JOIN连接的基本用法实例

五、全连接:OUTER JOIN

全连接就是左连接和右连接的并集,但是MySQL中并不支持全连接的写法

SELECT * FROM tab1 OUTER JOIN tab2 ON tab1.id1 = tab2.id2

不过可以用UNION联合左连接和右连接的结果来代替

SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.id1 = tab2.id2
UNION
SELECT * FROM tab1 RIGHT JOIN tab2 ON tab1.id1 = tab2.id2

结果

MySQL中JOIN连接的基本用法实例

总结

到此这篇关于MySQL中JOIN连接基本用法的文章就介绍到这了,更多相关MySQL JOIN用法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
MySQL infobright的安装步骤
Apr 07 MySQL
MySQL之高可用集群部署及故障切换实现
Apr 22 MySQL
MySQL 视图(View)原理解析
May 19 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
MySQL中几种插入和批量语句实例详解
Sep 14 MySQL
一条慢SQL语句引发的改造之路
Mar 16 MySQL
Mysql事务索引知识汇总
Mar 17 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
MySQL读取JSON转换的方式
Mar 18 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 MySQL
MySQL中order by的执行过程
MySQL 语句执行顺序举例解析
Jun 05 #MySQL
MySql数据库触发器使用教程
Jun 01 #MySQL
MySQL选择合适的备份策略和备份工具
MySQL普通表如何转换成分区表
May 30 #MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 #MySQL
MySQL数据库安装方法与图形化管理工具介绍
You might like
PHP中怎样防止SQL注入分析
2014/10/23 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
javascript 文件的同步加载与异步加载实现原理
2012/12/13 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
vue实现一个移动端屏蔽滑动的遮罩层实例
2017/06/08 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
Vue管理系统前端之组件拆分封装详解
2020/08/23 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
学生会主席就职演讲稿
2014/01/14 职场文书
运动会通讯稿50字
2014/01/30 职场文书
作弊检讨书1000字
2014/02/01 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
CSS3实现360度循环旋转功能
2022/02/12 HTML / CSS