13.连表查询-join
连接的本质:
- 把各个连接表中的记录都取出来依次匹配的组合加入结果集并返回给用户
示意图:

连接的类型:
- 根据驱动表中的记录在被驱动表中无匹配时,是否加入到最后的结果集分为:
- 内连接
INNER JOIN
:不加入结果集 - 外连接:加入结果集
- 内连接
- 根据驱动表选择分为:
- 左外连接
LEFT JOIN
:选取左侧的表为驱动表 - 右外连接
RIGHT JOIN
:选取右侧的表为驱动表
- 左外连接
条件过滤:
WHERE
:不论是内连接
还是外连接
,凡是不符合WHERE
子句中的过滤条件的记录都不会被加入最后的结果集ON
:对于外连接
的驱动表,如果无法在被驱动表中找到匹配ON
子句中的过滤条件的记录,那么该记录仍然会被加入到结果集中并使用NULL
值填充(如果用在内连接中,则跟where没区别
)
嵌套循环连接(Nested-Loop Join):
- 步骤:
- 选取驱动表,
使用与驱动表相关的过滤条件
,选取代价最低的单表访问方法
来执行对驱动表的单表查询。 - 对上一步骤中查询驱动表得到的结果集中每一条记录,都分别到被驱动表中查找匹配的记录。
- 选取驱动表,
- 驱动表只访问一次,被驱动表却可能被多次访问,访问次数取决于对驱动表执行单表查询后的结果集中的记录条数。这种连接执行方式称之为嵌套循环连接
基于块的嵌套循环连接(Block Nested-Loop Join):
- 使用
join buffer
来减少被驱动表的磁盘IO次数 - 核心思想:两个表
各自先查询独自仅有的条件
,然后再一次性比较连接的条件 join buffer
:执行连接查询前申请的一块固定大小的内存。- 先把若干条驱动表结果集中的记录装在这个
join buffer
中 - 然后开始扫描被驱动表
- 每一条被驱动表的记录一次性和
join buffer
中的多条驱动表记录做匹配
- 先把若干条驱动表结果集中的记录装在这个
join buffer
优点:因为匹配的过程都是在内存中完成的,所以这样可以显著减少被驱动表的I/O
代价
本文作者:navyum
本文链接:https://www.cnblogs.com/navyum/p/18509405
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步