vlambda博客
学习文章列表

你真的知道Mysql中外连接,内连接,左连接,右连接吗??


养成习惯,先赞后看!!!
@TOC

1. 前言

相信大家一定都做过多表的连表查询,并且这其中的查询方式也比较多样.

在这里插入图片描述

可能主要就是下面这几种方式:

  • 直接通过where语句将重叠的字段进行匹配就比如下面这种

select * from tablea,tableb where tablea.aid=tableb.bid;

  • 另外一种就是通过内连接或者外连接的方式,就比如下面这种

select * from tablea LEFT JOIN tableb on tablea.aid=tableb.bid;
select * from tablea RIGHT JOIN tableb on tablea.aid=tableb.bid;
select * from tablea INNER JOIN tableb on tablea.aid=tableb.bid;

可能第一种通过where语句查询,大家都能理解.
但是不知道大家有没有去尝试过理解下面关于内连接与外连接查询方式的区别 ,接下来我们先通过一张图来演示一下连接的整个层级关系:

你真的知道Mysql中外连接,内连接,左连接,右连接吗??
在这里插入图片描述

接下来我们再来详细讲解他们之间的区别.
我们先看看这次使用的两个表的结构以及数据:
tablea:
你真的知道Mysql中外连接,内连接,左连接,右连接吗??
在这里插入图片描述

tableb:

你真的知道Mysql中外连接,内连接,左连接,右连接吗??
在这里插入图片描述

2. 外连接

2.1左连接

我们先通过两个例子来让大家看看实际的效果我们再来细讲:

select * from tablea LEFT JOIN tableb on tablea.aid=tableb.bid;
你真的知道Mysql中外连接,内连接,左连接,右连接吗??
在这里插入图片描述

显然这里是以 tablea 的数据为基准的


select * from tableb LEFT JOIN tablea on tablea.aid=tableb.bid;
你真的知道Mysql中外连接,内连接,左连接,右连接吗??
在这里插入图片描述

显然这里是以 tableb 的数据为基准的


看完这两个例子,想必大家也能够自己分析出来了,显然永远是左表的数据是完整的,右表中只会查询出与左表匹配的数据,如果不匹配就不显示,显示为空.整个过程都是以左表为基准

2.2右连接

我们也是通过两个例子来细讲:

select * from tablea RIGHT JOIN tableb on tablea.aid=tableb.bid;
你真的知道Mysql中外连接,内连接,左连接,右连接吗??
在这里插入图片描述

显然这里是以 tableb 的数据为基准的


select * from tableb RIGHT JOIN tablea on tablea.aid=tableb.bid;
你真的知道Mysql中外连接,内连接,左连接,右连接吗??
在这里插入图片描述

显然这里是以 tablea 的数据为基准的


看完这两个例子,想必大家也能够自己分析出来了,显然永远是右表的数据是完整的,左表中只会查询出与右表匹配的数据,如果不匹配就不显示,显示为空.整个过程都是以右表为基准

到这里我们就要稍微区分一下基准表的定义,我们切不可将那个表名在前就觉得它是基准表,这里还是通过下面两张图:

  • 左连接基准表

    你真的知道Mysql中外连接,内连接,左连接,右连接吗??
    在这里插入图片描述
  • 右连接基准表

    你真的知道Mysql中外连接,内连接,左连接,右连接吗??
    在这里插入图片描述


    所以基准表并不是以谁写在前面谁就是基准表定义的,还是通过位置来定义的,左连接就以左边的表为基准表,右连接就以右边的表为基准.


3. 内连接

select * from tableb INNER JOIN tablea on tablea.aid=tableb.bid;
在这里插入图片描述

这里我们通过与上面外连接的对比分析之后就可以看出来,内连接整个更加能够体现数据的完整性,上图我们可以看出内连接只会显示所有产生连接的数据,那些不匹配的数据,不管是左表中的还是右表中的.


通过上面几个例子.相信大家就能够更加理解MYSQL中这几种连接的意义了.

在这里插入图片描述