转载自:https://blog.csdn.net/plg17/article/details/78758593

用两个表(a_table、b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接、外连接( 左(外)连接、右(外)连接、全(外)连接)。

MySQL版本:Server version: 5.6.31 MySQL Community Server (GPL)

数据库表:a_table、b_table

主题:内连接、左连接(左外连接)、右连接(右外连接)、全连接(全外连接)

前提

建表语句:

  1. CREATE TABLE `a_table` (
  2. `a_id` int(11) DEFAULT NULL,
  3. `a_name` varchar(10) DEFAULT NULL,
  4. `a_part` varchar(10) DEFAULT NULL
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  1. CREATE TABLE `b_table` (
  2. `b_id` int(11) DEFAULT NULL,
  3. `b_name` varchar(10) DEFAULT NULL,
  4. `b_part` varchar(10) DEFAULT NULL
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

表测试数据:

一、内连接

关键字:inner join on

语句:select * from a_table a inner join b_table b on a.a_id = b.b_id;
执行结果:

说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

二、左连接(左外连接)

关键字:left join on / left outer join on
语句:select * from a_table a left join b_table b on a.a_id = b.b_id;
执行结果:

说明:
left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

三、右连接(右外连接)

关键字:right join on / right outer join on
语句:select * from a_table a  right outer join b_table b  on a.a_id = b.b_id;
执行结果:

说明:
right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。

四、全连接(全外连接)

MySQL目前不支持此种方式,可以用其他方式替代解决。

五、补充,MySQL如何执行关联查询

MySQL认为任何一个查询都是一次“关联”,并不仅仅是一个查询需要到两个表匹配才叫关联,所以在MySQL中,每一个查询,每一个片段(包括子查询,甚至基于单表查询)都可以是一次关联。
当前MySQL关联执行的策略很简单:MySQL对任何关联都执行嵌套循环关联操作,即MySQL先在一个表中循环取出单条数据,然后在嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。请看下面的例子中的简单的查询:
查询语句:select tbl1.col1, tbl2.col2 from tbl1 inner join tbl2 using(col3) where tbl1.col1 in (5, 6);
假设MySQL按照查询中的表顺序进行关联操作,我们则可以用下面的伪代码表示MySQL将如何完成这个查询:
  1. outer_iter = iterator over tbl1 where col1 in (5, 6)
  2. outer_row = outer_iter.next
  3. while outer_row
  4. inner_iter = iterator over tbl2 where col3 = outer_row.col3
  5. inner_row = inner_iter.next
  6. while inner_row
  7. output [ outer_row.col1, inner_row.col2]
  8. inner_row = inner_iter.next
  9. end
  10. outer_row = outer_iter.next
  11. end

上面的执行计划对于单表查询和多表关联查询都适用,如果是一个单表查询,那么只需要上面外层的基本操作。对于外连接,上面的执行过程仍然适用。例如,我们将上面的查询语句修改如下:
select tbl1.col1, tbl2.col2 from tbl1 left outer join tbl2 using(col3) where tbl1.col1 in (5, 6);

那么,对应的伪代码如下:
  1. outer_iter = iterator over tbl1 where col1 in (5, 6)
  2. outer_row = outer_iter.next
  3. while outer_row
  4. inner_iter = iterator over tbl2 where col3 = outer_row.col3
  5. inner_row = inner_iter.next
  6. if inner_row
  7. while inner_row
  8. output [ outer_row.col1, inner_row.col2]
  9. inner_row = inner_iter.next
  10. end
  11. else
  12. output [ outer_row.col1, null]
  13. end
  14. outer_row = outer_iter.next
  15. end

说明:第五部分摘自《高性能MySQL 第三版》

图解MySQL 内连接、外连接、左连接、右连接、全连接相关推荐

  1. mysql内外链接图_图解MySQL 内连接、外连接、左连接、右连接、全连接

    用两个表(a_table.b_table),关联字段a_table.a_id和b_table.b_id来演示一下mysql的内连接.外连接( 左(外)连接.右(外)连接.全(外)连接). mysql版 ...

  2. 图解MySQL 内连接、外连接、左连接、右连接、全连接……太多了

    用两个表(a_table.b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接.外连接( 左(外)连接.右(外)连接.全(外)连接). MySQL版 ...

  3. 图解MySQL 内连接、左连接、右连接

    一.准备工作 用两个表(a_table.b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接.外连接( 左(外)连接.右(外)连接.全(外)连接). ...

  4. 【MySQL】MySQL 的连接(内、左、右、全)

    一.表 的连 结 1.目的:减少数据的冗余 2.核心:分类 ***连接时至少要两张表,连接主要有内连接(inner join).左外连接(left outer join).右外连接(right out ...

  5. 数据库内、外、左、右连接详解

    写在前面: 数据库连接操作非常重要,明确连接操作有助于更好地掌握SQL语句查询操作. 数据库连表方式: 内连接 :inner join 外连接 :outer join 左外连接 :left outer ...

  6. tplink连接服务器失败_管家婆财贸双全连接失败,服务器端没有找到加密狗

    管家婆财贸双全连接失败,服务器端没有找到加密狗 管家婆财贸双全找不到狗判断步骤 1.先判断电脑能否识别管家婆财贸双全加密狗我的电脑--右键--属性--硬件--设备管理器--通用串行总线控制器(或人体学 ...

  7. 实例讲解内连接、左连接、右连接、交叉连接、外连接以及全连接

    目录 示例表: 1.内连接-inner: 实例1:内连接表a和表b 实例2:内连接表a和表c 实例3:内连接表a和表b,使用">"号 实例4:内连接表a和表b,使用" ...

  8. 图解SQL的连接:左连接、右连接、全连接、内连接、自然连接

    SQL的连接分为三类: 外连接(包括左连接left join.右连接right join.全连接full join) 内连接 inner join 自然连接 natural join 我们来看一个超级 ...

  9. MySQL数据库基础(多表关联查询、内外全连接、复合条件查询、子查询)

    文章目录 一.笛卡尔积查询 二.内.外.全连接查询 三.复合条件查询 四.子查询 五.EXIST判断 本篇文章主要介绍MySQL里的多表关联查询,其中包括了笛卡尔积查询.内连接查询.外连接查询.全连接 ...

  10. (六)MySQL数据库高阶语句之正则表达式、运算符、连接表达式JOIN

    文章目录 一.正则表达式 二.运算符 1.算术运算符 2.比较运算符 3.逻辑运算符(布尔值) 4.位运算符 5.优先级 三.连接查询 1.内连接 2.左连接 3.右连接 一.正则表达式 MySQL ...

最新文章

  1. 简述ssl协议及利用openssl创建私有CA
  2. 零基础Java学习之初始化块
  3. python解释器是什么-python解释器都有什么
  4. mysql数据备份mysqldump
  5. lede 命令 启用 ssh_PHP imap_open函数任意命令执行漏洞
  6. frontend badi
  7. Synchronized总结
  8. 【Java】Socket网络编程解读与实战
  9. 就谈个py 的装饰器 decorator
  10. 使用Spark Streaming进行情感分析
  11. 基础知识复习(一)——C语言位运算符详解
  12. 国内十大主流安卓和iOSApp应用商店推广渠道列表
  13. 央视频卫视app直播收看教程(2021)
  14. 易语言 安装目录没有VC98linker 编译不成功 VC98linker静态连接器(迷你版),易语言VC98linker破解工具,修复静态编译。
  15. 2021-08-29 网安实验-网络协议栈渗透测试之DDOS攻击之CC攻击
  16. android studio项目中将普通文件夹变成moudle
  17. Tracup已证明,高效敏捷的沟通与协作可提升IT生产力
  18. 纽约峭石之巅观景台:从直入云天的城市之巅眺望纽约全景
  19. Gradle基础:4:Task的使用方式
  20. 力扣(98.107)补9.10

热门文章

  1. 超长文全面解析设备树
  2. Flash Player 独立安装包/历史版本下载地址
  3. Linux Poll函数基础介绍
  4. 中关村大数据交易平台正式启用
  5. 01-硬件设计-VPX高速连接器介绍
  6. 寒哥教你学iOS 经验漫谈
  7. 2019年2月24日训练总结
  8. 调用摄像头,拍一张照片并进行传输到后端的代码。涉及到IO流,文件操作File
  9. IBM Cluster 1350与CSM
  10. 数据库系列之特定实例错误