mySQL包含两种联接,分别是内连接(inner join)和外连接(out join),但我们又同时听说过左连接,交叉连接等术语,本文旨在总结这些术语之间的关系。

1. 内连接

首先说明内连接的一个重要性质:内连接查询结果与表的顺序无关
(当然顺序可能会发生变化,但是对应关系绝对不会错乱!!!)

1.1 交叉连接(cross join)

当然,他还有其他的名字,比如:笛卡尔积,交叉积,还有最奇怪的名字“没有连接”(no join)

使用下列命令同时查询玩具表的toy列和男孩表的boy列,得到的结果就是交叉连接

SELECT t.toy,b.boy
FROM toys AS tCROSS JOINboys AS b;

其中,CROSS JOIN可以省略,简写为

SELECT t.toy,b.boy
FROM toys AS t,  boys AS b;

交叉连接回把第一张表的每个值与第二张表的每个值进行匹配,结果如下

交叉连接是内连接的一种,你又可以把内连接看作是通过查询中的条件过滤掉某些结果数据行之后的交叉连接。

1.2 相等连接

我们假设每个男孩子都又一个玩具,表之间是一对一的关系,toy_id是外键,数据库表如下图

我们想找到每个男孩儿拥有什么玩具,只需要将boys表中的toy_id和toys中的主键进行比对,就会得到结果

SELECT boys.boy,toys.toy
FROM boysINNER JOINtoys
ON boys.toy_id=toys.toy_id;

1.3 不等连接

我们继续沿用1.2中的表结构,如果我们想找到每个男孩儿没有的玩具,这时候我们可以使用不等连接(说白了就是=换成<>,其他没有什么区别)

SELECT boys.boy,toys.toy
FROM boysINNER JOINtoys
ON boys.toy_id<>toys.toy_id
ORDER BY boys.boy;

1.4 自然连接

继续沿用1.2的表结构。。。。。
注意:自然连接只有在连接的列在两张表中的名称都相同时才会有用
其实,自然连接就是自动识别相同列的相等连接

SELECT boys.boy,toys.toy
FROM boysNATURAL JOINtoys
ORDER BY boys.boy;

得到的结果和1.2中的结果完全一样(顺序可能不同)

2. 外连接

首先说明外连接不同于内连接的一个性质:外连接查询与表的顺序有关

2.1 左外连接

LEFT OUTER JOIN(左外连接)接收左表的所有行,并用这些行与右表进行匹配
当左表与右表具有一对多的关系时,左外连接特别有用。我们仍然使用之前的表结构

现在我们利用左外连接找出每个男孩拥有的玩具

SELECT b.boy,t.toy
FROM boys b
LEFT OUTER JOIN toys t
ON b.toy_id=t.toy_id;

LEFT OUTER JOIN左边的表boys我们称为左表,右边的toys称为右表,所以LEFT OUTER JOIN会取得左表boys的所有行和右表的toys的行进行匹配,结果如下

我们的查询结果和使用内连接时一样,难道说内连接和外连接没区别吗?怎么可能!!!接下来我们改变一下左表boys的表结构

我们向boys中新添加了一个Andy,把他的toy_id设置为6,注意,6在toys表中没有对应的玩具,接下来再次运行上述程序

我们发现居然出现了一个NULL,NULL的出现是要告诉我们右表toys中没有与左表boys中的Andy相匹配的行,也就是说

外连接一定会提供数据行,无论还行能否在另一个表中找出相匹配的行

接着做个实验,我们调换左表和右表的顺序

SELECT b.boy,t.toy
FROM toys t
LEFT OUTER JOIN boys b
ON b.toy_id=t.toy_id;

结论:出现NULL的列总是右表中的列

以下时左外连接的实际匹配过程

toys中的玩具hula hoop与boys中的Davey的记录比对,toys.toys_is=1,boys.toy_is=3
不匹配
toys中的玩具hula hoop与boys中的Bobby的记录比对,toys.toys_is=1,boys.toy_is=5
不匹配
toys中的玩具hula hoop与boys中的Beaver的记录比对,toys.toys_is=1,boys.toy_is=2
不匹配
toys中的玩具hula hoop与boys中的Richie的记录比对,toys.toys_is=1,boys.toy_is=1
成功匹配
…省略toy_id=2,3的匹配过程
toys中的玩具harmonica与boys中的Davey的记录比对,toys.toys_is=4,boys.toy_is=3
不匹配
toys中的玩具harmonica与boys中的Bobby的记录比对,toys.toys_is=4,boys.toy_is=5
不匹配
toys中的玩具harmonica与boys中的Beaver的记录比对,toys.toys_is=4,boys.toy_is=2
不匹配
toys中的玩具harmonica与boys中的Richie的记录比对,toys.toys_is=4,boys.toy_is=1
不匹配
右表查找完毕,没有匹配项,因此创建带有NULL值的行来对应harmonica
…省略baseball cards的匹配过程

2.2 右外连接

与左外连接完全相同,只不过是用右表来评价左表
此外:RIGHT OUTER JOIN左侧的表为右表!!!!!
这里只简单举一个例子,具体内容参考左外连接

SELECT b.boy,t.toy
FROM toys t
RIGHT OUTER JOIN boys b
ON b.toy_id=t.toy_id;

上述代码等同于

SELECT b.boy,t.toy
FROM boys b
LEFT OUTER JOIN toys t
ON b.toy_id=t.toy_id;

这两种写法都是都把toys作为右表,把boys作为左表

实验的表结构如下:

结果:

在实际运用过程中,我们一般倾向于只使用一种,另一种简单了解就好。

内连接(inner join)与外连接(outer join)小结相关推荐

  1. MySQL LEFT/RIGHT JOIN:外连接查询

    MySQL 中内连接是在交叉连接的结果集上返回满足条件的记录:而外连接先将连接的表分为基表和参考表,再以基表为依据返回满足和不满足条件的记录. 外连接更加注重两张表之间的关系.按照连接表的顺序,可以分 ...

  2. 13、 LEFT/RIGHT JOIN:外连接(左连接,右连接)

    内连接的查询结果都是符合连接条件的记录,而外连接会先将连接的表分为基表和参考表,再以基表为依据返回满足和不满足条件的记录. 外连接可以分为左外连接和右外连接,下面根据实例分别介绍左外连接和右外连接. ...

  3. 数据库:区分笛卡儿积、自然连接、内连接、等值连接、外连接

    假设存在两张表 c 和 p,这里使用的是MySQL数据库. 数据表 c: course_id title dept_name credits BIO-301 Genetics Biology 4 CS ...

  4. mysql a左外连接b b左外连接c_数据库中的 内连接,外连接(左连接,左外连接,右连接,右外连接),全连接,交叉连接...

    数据库的连接类型:内连接,外连接,全连接 ,交叉连接 作用:连接是关系数据库的特点,数据的关联查询用到 多表连接 提高查询效率 前段时间面试被问到数据库的内连接和外连接的问题,进过一番周折的无师自通, ...

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

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

  6. oracle左外连接语法,Oracle 左外连接、右外连接、全外连接小总结

    Oracle 左外连接.右外连接.全外连接小总结: 1.左外连接: left outer join 或者 left join 左外连接就是在等值连接的基础上加上主表中的未匹配数据,例: SELECT ...

  7. 理解内连接中的隐式内连接、显式内连接和外连接中的左外连接、右外连接

    一.多表查询 二.在 MySQL 中创建 book 和 actor 两张表 1 创建 book 表及添加数据 CREATE TABLE `book` (`id` INT PRIMARY KEY NOT ...

  8. mysql的内连接、等值连接、外连接

    内连接就是等值连接 所以一般直接在where语句中直接将相同字段用等号连接就行. select emp.empno,emp.ename,emp.deptno,dept.loc from emp,dep ...

  9. LINQ IN ACTION读书笔记:LINQ 使用连接 1、组连接 2、内连接 3、左外连接 4、交叉连接 使用和区别...

    使用的数据源类型: static public class SampleData{static public Publisher[] Publishers ={new Publisher {Name= ...

  10. Flink使用connect实现双流join全外连接

    一.背景说明 在Flink中可以使用Window join或者Interval Join实现双流join,不过使用join只能实现内连接,如果要实现左右连接或者外连接,则可以通过connect算子来实 ...

最新文章

  1. 【通用CSS模板】移动端H5页面统一样式.css
  2. 《软件定义网络:基于OpenFlow的SDN》一一2.5 本章总结
  3. Noip前的大抱佛脚----字符串
  4. 反向传播算法_9.3 反向传播算法的直观理解 Backpropagation Intuition
  5. Python3算法基础练习:编程100例(6 ~ 10)
  6. 朋友在征信太烂没法办贷款,先买在我名下再过户是否行得通?
  7. 五、工作量证明链解决拜占庭将军问题之模拟程序(Objective-C)
  8. AspectJ声明式事务配置
  9. 【文献阅读】Self-Normalizing Neural Networks
  10. oracle sga设置 256G,Oracle SGA大小的解决方法的调整
  11. jQuery鼠标悬停文字渐隐渐现动画效果
  12. Mac 调整磁盘分区:调整本地与虚拟机内存分区占比
  13. 第一易,唯一难,为什么它是ofo、天学网的不二选择
  14. ImageList00
  15. 计算机硬件维护注意事项,电脑硬件日常维护和注意事项
  16. 海词词典android v3.1.2新版发布 英语学习必备工具,海词词典Android V3.1.2新版发布 英语学习必备工具...
  17. 哪个选项是python语言_关于Python语言的描述,错误的选项是______。???????????????????????????????????????...
  18. python 拼音地名对应关系,使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务...
  19. 小白入门Git详细教程
  20. 计算机专业小论文题目,计算机专业小类论文题目 计算机专业小论文题目怎样拟...

热门文章

  1. 192.168.0.1路由器设置进入
  2. 12306 验证码验证流程
  3. 龙哥库他发matlab程序,编程实现四阶龙哥库塔法解方程
  4. als算法参数_推荐算法之ALS
  5. 消息队列,问题与处理方案梳理
  6. 服务器优盘启动安装win7系统教程,u盘装win7系统详细教程图解
  7. 《千字文》 梁•周兴嗣
  8. react router 路由守卫_react实现路由守卫
  9. cmd中start 命令用法
  10. 你听过“费斯汀格法则”吗?多少人因为不懂而被残害!好文!