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 如何分析查询性能
May 12 MySQL
MySQL索引是啥?不懂就问
Jul 21 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
MySQL配置主从服务器(一主多从)
Aug 07 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
CentOS MySql8 远程连接实战
Apr 19 MySQL
MySQL示例讲解数据库约束以及表的设计
Jun 16 MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 MySQL
MySQL主从切换的超详细步骤
Jun 28 MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 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连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
apache php模块整合操作指南
2012/11/16 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
Javascript里使用Dom操作Xml
2006/09/20 Javascript
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
2018/09/27 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
Django如何在不停机的情况下创建索引
2020/08/02 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
2021/01/24 Python
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
基层党组织公开承诺书
2014/03/28 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
民主生活会主持词
2015/07/01 职场文书
教育读书笔记
2015/07/02 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL
Python代码实现双链表
2022/05/25 Python