介绍

left join的实现效果就是保留左表的全部信息,将右表往左表上拼接,如果拼不上则为NULL

除了left join以外,还有inner joinouter joinright join等,文章不介绍其他连接的具体效果,主要讲解join的底层原理是如何实现的?具体效果是怎样呈现的?

只有懂得了底层原理,才能更好的写出性能优越的SQL脚本,提高SQL的执行速度。

join主要有3种方式,具体为:

  • Nested Loop -- 嵌套循环,细分为以下3种连接方式:

    • Simple Nested-Loop Join
    • Index Nested-Loop Join
    • Block Nested-Loop Join
  • Hash Join
  • Merge Join

其他概念:

驱动表(也叫外表)和被驱动表(也叫非驱动表,还可以叫匹配表,亦可叫内表),简单来说,驱动表就是主表,left join 中的左表就是驱动表,right join 中的右表是驱动表。

一个是驱动表,那另一个就只能是非驱动表,在 join 的过程中,其实就是从驱动表里面依次(注意理解这里面的依次)取出每一个值,然后去非驱动表里面进行匹配。

Simple Nested-Loop Join

Simple Nested-Loop Join是这三种方法里面最简单,最好理解,也是最符合大家认知的一种连接方式。

现在有两张表 table Atable B,我们让table A left join table B,观察是怎样进行匹配的。

从驱动表table A依次取出每一个值,然后去非驱动表table B中进行从上往下依次匹配,将值返回。

利用这种方式进行匹配,总共需要执行10×10=100次查询。

Index Nested-Loop Join

利用索引进行匹配,Index要求非驱动表上具有索引,有了索引以后可以减少匹配次数,提高查询效率。

数据库中索引一般采用B+树的存储结构,可以提高效率。

如果索引是主键的话,效率会更高,因为主键必须是唯一的。所以如果被驱动表是用主键去连接,只会出现多对一或者一对一的情况,而不会出现多对多和一对多的情况。

Block Nested-Loop Join

理想情况下,用索引匹配是最高效的一种方式,但是在现实工作中,并不是所有的列都是索引列,这个时候就需要用到 Block Nested-Loop Join 方法了,这种方法与第一种方法比较类似,唯一的区别就是会把驱动表中 left join 涉及到的所有列(不止是用来on的列,还有select部分的列)先取出来放到一个缓存区域,然后再去和非驱动表进行匹配,这种方法和第一种方法相比所需要的匹配次数是一样的,差别就在于驱动表的列数不同,也就是数据量的多少不同。

所以虽然匹配次数没有减少,但是总体的查询性能还是有提升的。

参考链接:SQL底层原理

SQL中 left join 的底层原理的更多相关文章

  1. sql中的join

    首先准备数据 有以下数据,三张表:role(角色表).hero(英雄表).skill(技能表),我们以英雄联盟的数据做示例 一个hero对应一个role(我们这里暂定) 一个role可以对应多个her ...

  2. SQL中inner join、outer join和cross join的区别

    对于SQL中inner join.outer join和cross join的区别简介:现有两张表,Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同 ...

  3. SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别

    前言: 今天主要的内容是要讲解SQL中关于Join.Inner Join.Left Join.Right Join.Full Join.On. Where区别和用法,不用我说其实前面的这些基本SQL语 ...

  4. 【转载】SQL中inner join、outer join和cross join的区别

    对于SQL中inner join.outer join和cross join的区别很多人不知道,我也是别人问起,才查找资料看了下,跟自己之前的认识差不多, 如果你使用join连表,缺陷的情况下是inn ...

  5. LINQ TO SQL 中的join(转帖)

    http://www.cnblogs.com/ASPNET2008/archive/2008/12/21/1358152.html join对于喜欢写SQL的朋友来说还是比较实用,也比较容易接受的东西 ...

  6. SQL中的JOIN语法详解

    参考以下两篇博客: 第一个是 sql语法:inner join on, left join on, right join on详细使用方法 讲了 inner join, left join, righ ...

  7. Access SQL中Left Join、Right Join和Inner Join的使用

    1.表结构 表A                                     表B 2.Left Join 示例:2.1 Select * From A left join B on A. ...

  8. 一条查询sql的执行流程和底层原理

    1.一条查询SQL执行流程图 2.查询SQL执行流程之发送SQL请求 (1)客户端按照Mysql通信协议将SQL发送到服务端,SQL到达服务端后,服务端会单起一个线程执行SQL. (2)执行时Mysq ...

  9. SQL中的Join和Where的区别

    一.sql语句中left join.inner join中的on与where的区别 0.各种join操作的概念和作用 left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. ...

随机推荐

  1. 手把手教你把5V的Arduino改造成3.3V版本

    Arduino Pro Mini是基于ATmega328的微控制板,支持5V/3.3V电压.但是我们比较容易买到的是5V供电的版本,有的时候需要用到3.3V版本(比如我们的软控DAC).怎样才能让这款 ...

  2. 动态库(.so)隐藏函数名

    一.偶遇 error: undefined reference to  xxx 问题 尝试封装通用的接口到一个private.so,然后供客户端使用,private.so编译出来后由sample.cp ...

  3. 将ejs模板文件的后缀换成html

    1.app.js的头部定义ejs: var ejs = require('ejs'): 2注册html模板引擎: app.engine('html',ejs.__express); 3.将模板引擎换成 ...

  4. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-8.用户模块开发之保存微信用户信息

    笔记 8.用户模块开发之保存微信用户信息     简介:开发User数据访问层,保存微信用户信息 问题:             微信回调 用户昵称乱码             解决:        ...

  5. 一百一十五:CMS系统之实现点击更换图形验证码功能

    把验证码渲染到到页面上 访问,显然,是标签有个内边距 去掉内边距 加一个class 如果放大看的话,还有问题 用js实现点击更换图形验证码:生成查询字符串的形式访问图形验证码接口的url,放到img标 ...

  6. JAVA 基础编程练习题1 【程序 1 不死神兔】

    1 [程序 1 不死神兔] 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月 又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子 ...

  7. DELPHI ClientData使用详解

    在三层结构中,TClientDataSet的地位是不可估量的,她的使用正确与否,是十分关键的,本文从以下几个方面阐述她的使用,希望对你有所帮助. 1.动态索引procedure TForm1.DBGr ...

  8. Two-stream双流总结

    1.2014.Two-stream convolutional networks for action recognition in videos 两个流:空间流做single frame,时间流做m ...

  9. k8s 管理机密信息

    一.启动应用安全信息的保护: Secret介绍: 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 ...

  10. 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID

    问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...