以不同的角度来看内连接和外连接

来源:互联网 发布:又拍云和阿里云 编辑:程序博客网 时间:2024/04/27 18:56

使用过MySQL的人都知道连接查询在MySQL查询中使用频率最高的,但是在使用过程中都或多或少地遇到一些疑惑,内连接和外连接的使用场景到底是怎样的?这其中又暗藏着什么样的玄机?接着,让我们以不同的角度来分析下内连接和外连接的区别吧!

准备工作

众所周知,验证和探索某一个问题时,首先要做的是做一些准备工作,就像在做数学证明题时,都需要准备一些证明过程的前提要点,而我的“前提要点”就是创建表,有了表,才好开始干事!

创建表

学生表

这里写图片描述

课程表

这里写图片描述

分数表

这里写图片描述

表建好之后,首先我们需要从定义上先来初步了解下内连接外连接—————


定义

  • 内连接
    • 从专业术语来讲,所谓内连接,就是使用比较运算符根据每个表共有的列的值匹配两个表中的行;
    • 从数学的角度来看,内连接实质就是几个表之间求取交集,即:A∩B∩C,如图所示:
      这里写图片描述
    • 实例:
SELECT * from student t1INNER JOIN sc t2 ON t1.Sid = t2.SidINNER JOIN course t3 ON t2.Cid = t3.CidGROUP BY t1.sid,t1.sname ORDER BY t2.score;

查询结果如下:

这里写图片描述


  • 左外连接
    • 从专业术语来讲,所谓左连接,就是以左表为主表,不管连接条件是否达成,主表的内容总是会显示出来,使用比较运算符返回主表和两个表共有行的内容,如果连接条件未达到,那么显示null;
    • 从数学的角度,实质就是返回主表和两个表之间的交集结果集内容,即:假设A表为主表,那么返回结果集为:AU(A∩B∩C),如上;
    • 实例:
SELECT * from student t1LEFT JOIN sc t2 ON t1.Sid = t2.SidLEFT JOIN course t3 ON t2.Cid = t3.CidGROUP BY t1.sid,t1.sname ORDER BY t2.score;

查询结果如下:
这里写图片描述


  • 右外连接
    • 从专业术语来讲,所谓右连接,就是以右表为主表,不管连接条件是否达成,主表的内容总是会显示出来,使用比较运算符返回主表和两个表共有行的内容,如果连接条件未达到,那么显示null;
    • 从数学的角度,实质就是返回主表和两个表之间的交集结果集内容,即:假设A表为主表,那么返回结果集为:AU(A∩B∩C),如上图;
    • 实例:
SELECT * from student t1RIGHT JOIN sc t2 ON t1.Sid = t2.SidRIGHT JOIN course t3 ON t2.Cid = t3.CidGROUP BY t1.sid,t1.sname ORDER BY t2.score;

查询结果如下:
这里写图片描述


从性能的角度来看待内连接和外连接

其实有时候内连接和外连接的查询结果是一样的,在本质上,两者只是存在丢失数据方面存在一些差别,但是在大数据环境下,对于性能,两者又存在着一些什么区别呢?
在我翻看一些文章时,发现内连接和外连接的性能与不同的数据环境有关系,比如:

Left JION优于INNERJION的情形:https://stackoverflow.com/questions/17100819/left-join-significantly-faster-than-inner-join

INNER JION优于Left JION的情形:https://stackoverflow.com/questions/2726657/inner-join-vs-left-join-performance-in-sql-server

具体看情况:https://stackoverflow.com/questions/1810465/left-join-faster-or-inner-join-faster

注:如果有谁在这方面能给予更好的理解,请在下面留言指出,谢谢!