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 亿级数据导入导出及迁移笔记
Jun 18 MySQL
MySQL系列之六 用户与授权
Jul 02 MySQL
浅谈MySQL之select优化方案
Aug 07 MySQL
MySQL连接控制插件介绍
Sep 25 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
mysql insert 存在即不插入语法说明
Mar 25 MySQL
mysql的单列多值存储实例详解
Apr 05 MySQL
Golang连接并操作MySQL
Apr 14 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
Mysql表数据比较大情况下修改添加字段的方法实例
Jun 28 MySQL
mysqldump进行数据备份详解
Jul 15 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
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
javascript offsetX与layerX区别
2010/03/12 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
jQuery实现购物车数字加减效果
2015/03/14 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
2019/05/30 NodeJs
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
Pytorch中.new()的作用详解
2020/02/18 Python
Python流程控制常用工具详解
2020/02/24 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
pycharm实现猜数游戏
2020/12/07 Python
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
审核会计岗位职责
2013/11/08 职场文书
化验室技术员岗位职责
2013/12/24 职场文书
简历的个人自我评价范文
2014/01/03 职场文书
公司合作意向书
2014/04/01 职场文书
Golang 并发下的问题定位及解决方案
2022/03/16 Golang
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫