Mysql内连接与外连接的区别详解

 更新时间:2023年01月28日 09:01:46   作者:用心看  
最近别人问我一个问题:数据库中的左连接和右连接有什么区别?所以这篇文章主要给大家介绍了关于Mysql内连接和外连接区别的相关资料,需要的朋友可以参考下

前言

我在写sql查询的时候,用的最多的就是where条件查询,这种查询也叫内连查询inner join,当然还有外连查询outer join,左外连接,右外连接查询,常用在多对多关系中,那他们区别和联系是什么呢?

内连接inner join

内连接最常用定义:

连接结果仅包含符合连接条件的行组合起来作为结果集,参与连接的两个表都应该符合连接条件使用关键词:INNER JOIN 连接多张表
也就是返回两个表的交集(阴影)部分,如下图所示:

如下sql查询语句

查询所有分配了部门信息的用户信息

也就是部门id在用户表,和部门表都存在行符合条件数据才展示

select u.USERNAME, u.MOBILE, u.EMAIL, d.DEPT_NAME
from t_user u inner join
     t_dept d
on u.DEPT_ID = d.DEPT_ID

内连接还有一种隐式的写法,即不需要显示的指定 INNER JOIN 关键字

等价于

select u.USERNAME, u.MOBILE, u.EMAIL, d.DEPT_NAME
from t_user u,
     t_dept d
where u.DEPT_ID = d.DEPT_ID

一般我们常用直接使用where关键词查询连接条件这样更方便简单

外连接outer join

左(外)连接 left join

定义:

左(外)连接,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL,如下图所示:

语法

LEFT JOIN ON
LEFT OUTER JOIN ON

left join 是 left outer join 的简写,它的全称是左外连接,是外连接中的一种。

如下sql查询语句

查询所有员工信息(包含部门信息)

select u.USERNAME, u.MOBILE, u.EMAIL,u.DEPT_ID, d.DEPT_NAME
from t_user u left outer join
t_dept d
on u.DEPT_ID = d.DEPT_ID

等价于

select u.USERNAME, u.MOBILE, u.EMAIL,u.DEPT_ID, d.DEPT_NAME
from t_user u left join
t_dept d
on u.DEPT_ID = d.DEPT_ID

如下图我们可以看到,左外连接 t_user 表里面 USERNAME 为 kenx 的记录,其 DEPT_ID 为 15,但 DEPT_ID 为 15 的记录在 t_dept 表里面是不存在的,此时,我们用的是左外连接,因此,可以查出该条记录,但 t_dept 表里面的字段的值都是 NULL。

右(外)连接 right join

定义:

右(外)连接,右表的记录将会全部表示出来,而左表只会显示符合搜索条件的记录。左表记录不足的地方均为NULL,如下图所示:

语法

RIGHT JOIN ON
RIGHT OUTER JOIN ON

right join 是 right outer join 的简写,它的全称是右外连接,是外连接中的一种。

如下查询sql 语句

select u.USERNAME, u.MOBILE, u.EMAIL,u.DEPT_ID, d.DEPT_NAME
from t_user u right join
     t_dept d
on u.DEPT_ID = d.DEPT_ID

等价于

select u.USERNAME, u.MOBILE, u.EMAIL,u.DEPT_ID, d.DEPT_NAME
from t_user u right outer join
     t_dept d
on u.DEPT_ID = d.DEPT_ID

如下图 与左外连接刚好相反 查询出了所有部门信息,不符合条件的用户信息字段都为NULL

总结

内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。

外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。

左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。

右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。

全外连接:左外连接 union 右外连接,Mysql 中暂不支持。

到此这篇关于Mysql内连接与外连接区别的文章就介绍到这了,更多相关Mysql内连接与外连接区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 64位CentOs7源码安装mysql-5.6.35过程分享

    64位CentOs7源码安装mysql-5.6.35过程分享

    本文给大家分享的是在64位CentOs7系统中使用源码安装mysql-5.6.35的详细过程,非常的细致,有需要的小伙伴可以参考下
    2017-02-02
  • mysql中distinct和group by的区别浅析

    mysql中distinct和group by的区别浅析

    distinct简单来说就是用来去重的,而group by的设计目的则是用来聚合统计的,两者在能够实现的功能上有些相同之处,但应该仔细区分,下面这篇文章主要给大家介绍了关于mysql中distinct和group by区别的相关资料,需要的朋友可以参考下
    2023-05-05
  • 记一次Mysql不走日期字段索引的原因小结

    记一次Mysql不走日期字段索引的原因小结

    本文主要介绍了记一次Mysql不走日期字段索引的原因,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • MySQL快速禁用账户登入及如何复制/复用账户密码(最新推荐)

    MySQL快速禁用账户登入及如何复制/复用账户密码(最新推荐)

    这篇文章主要介绍了MySQL如何快速禁用账户登入及如何复制/复用账户密码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • MySQL中的驱动表与被驱动表及含义

    MySQL中的驱动表与被驱动表及含义

    使用join连接查询时如果有where条件,则MySQL执行器会根据查询条件过滤后的结果自动选择驱动表或被驱动表,这篇文章主要介绍了MySQL的驱动表与被驱动表,需要的朋友可以参考下
    2023-10-10
  • Django创建项目+连通mysql的操作方法

    Django创建项目+连通mysql的操作方法

    这篇文章主要介绍了Django创建项目+连通mysql的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 使用MySQL的LAST_INSERT_ID来确定各分表的唯一ID值

    使用MySQL的LAST_INSERT_ID来确定各分表的唯一ID值

    MySQL数据表结构中,一般情况下,都会定义一个具有‘AUTO_INCREMENT’扩展属性的‘ID’字段,以确保数据表的每一条记录都可以用这个ID唯一确定
    2011-08-08
  • 关于SQL语句中的AND和OR执行顺序遇到的问题

    关于SQL语句中的AND和OR执行顺序遇到的问题

    在SQL语句中的AND和OR执行顺序中我们经常会遇到一些问题,下面有简单的解决方法,小编来和大家一起来看看
    2019-05-05
  • MySQL创建用户与授权方法

    MySQL创建用户与授权方法

    MySQL中创建用户与授权的实现方法,对于刚开始接触mysql的朋友可以参考下
    2012-11-11
  • 老鸟带你开发专业规范的MySQL启动脚本

    老鸟带你开发专业规范的MySQL启动脚本

    这篇文章主要介绍了老鸟带你开发专业规范的MySQL启动脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论