,如果a是索引那么将使用单表查询的range访问方法
比如
select * from a , b where a.k1 = b.k2 and a.k3>b.k4 , 这里涉及的条件便是a.k1 = b.k2 and a.k3>b.k4 , 对于这种擦好像执行过程如下- 首先确定第一个需要查询的表,称为驱动表
mysql会选择代价最小的访问方法对驱动表进行查询
1中的驱动表获取到的每一条记录 , 都需要去另外一张表中查询匹配的记录
比如在a作为驱动表获取到了a.k1=1,a.k3=2那么接下来需要去表b中查询满足1=b.k2 and 2>b.k4的记录(并不是将在驱动表中获取到的记录缓存起来 , 再一起到被驱动表中进行查询 , 而是每在驱动表中获取到一条记录都会到被驱动表中查询满足的数据)
- 对于内连接的两个表 , 如果驱动表中的记录在被驱动表中找不到匹配的记录 , 那么该记录不会加入到最后的结果集 。
如select * from user_detail d ,user u where u.id = d.id查询结果如下

文章插图
user_detail中具备非常多的记录 , 但是和user中id匹配的记录只有id=3 , 这里也只能查出一条记录
- 对于外连接的表 , 即使驱动表中的记录在被驱动表中找不到匹配的记录 , 那么也会加入到结果集中
如select * from user_detail d left join user u onu.id = d.id查询结果如下

文章插图
即使在onu.id = d.id的限制下 , 只有id=3满足 , 其他id不满足 , 也会将其他记录加入到结果集 , 被驱动的字段使用null填充
左外连接 即左连接 , 右外连接 即右连接 , 二者的区别在于左连接是左边的表作为驱动表 , 右连接使用右边的表作为驱动表 。5.where 和 on在外连接中存在
where 和 on两种过滤条件 。- where
无论是内连接 , 还是外连接 , 只要不符合where条件的记录都不会加入到最后的结果集中
- on
对于外连接 , 如果无法在被驱动表中找到符合on的记录 , 驱动表的记录还是会加入结果集中 , 对应的被驱动表的各个字段使用null填充 。
如select * from user_detail d left join user u onu.id = d.id where d.detail like '%Dz%'查询结果如下

文章插图
最后只有满足d.detail like '%Dz%'的记录才会加入到结果集 。
对于下面的两个内连接查询语句
select * from user_detail d inner joinuser u on u.id = d.id and d.detail like '%Dz%'select * from user_detail d inner joinuser u on u.id = d.id where d.detail like '%Dz%'查询结果如下:

文章插图
内连接中 on 等同于where6.连接查询的原理上面我们复习了内连接外连接的基础知识 , 下面我们开始学习下mysql是如何进行连接查询的
6.1嵌套循环连接
- 选取驱动表 , 使用驱动表相关的过滤条件 , 选择代价最低的单表访问方法对驱动表进行单表查询
经验总结扩展阅读
- 手机怎样连接我的电脑(手机怎么访问自己电脑)
- MYSQL-->InnoDB引擎底层原理
- 浅谈MySQL、Hadoop、BigTable、Clickhouse数据读写机制
- Docker | Compose创建mysql容器
- 一文读懂 MySQL 索引
- 如何优雅的备份MySQL数据?看这篇文章就够了
- 【博学谷学习记录】超强总结,用心分享|MySql连接查询超详细总结
- day08-MySQL事务
- MySQL 窗口函数
- 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段
