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 相关文章推荐
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
详解MySQL主从复制及读写分离
May 07 MySQL
解读MySQL的客户端和服务端协议
May 10 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
一文带你探究MySQL中的NULL
Nov 11 MySQL
MySQL中varchar和char类型的区别
Nov 17 MySQL
MySQL实现配置主从复制项目实践
Mar 31 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
Apr 02 MySQL
以MySQL5.7为例了解一下执行计划
Apr 13 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
详解Mysql数据库平滑扩容解决高并发和大数据量问题
May 25 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程序员工具
2008/05/26 PHP
php自动适应范围的分页代码
2008/08/05 PHP
php读取xml实例代码
2010/01/28 PHP
php中根据变量的类型 选择echo或dump
2012/07/05 PHP
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
2020/12/07 Javascript
Python设计模式之代理模式实例
2014/04/26 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
python将音频进行变速的操作方法
2020/04/08 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
天巡全球:Skyscanner Global
2017/06/20 全球购物
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
Python中pass语句的作用是什么
2016/06/01 面试题
大学生怎样进行自我评价
2013/12/07 职场文书
员工生日会策划方案
2014/06/14 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
五年级上册复习计划
2015/01/19 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
详解Python函数print用法
2021/06/18 Python
解决vue中provide inject的响应式监听
2022/04/19 Vue.js