1. 前言

在之前的章节谈到了数据库设计范式,遵循范式之后,数据会被组织成不同的结构分散存储在不同的表内,例如所有学生会被存储在一张学生表,所有学生的成绩会被存储在一张成绩表,如果我们同时需要两张表的数据,就需要计算两张表间数据的映射关系,MySQL 数据库中最常用的方法就是连接。

2. 左连接、右连接、全连接

面试官: 请阐述下 MySQL 中左连接、右连接、全连接的定义和区别?

题目解析:

定义:MySQL 的连接表示多表(一般就是两张表)之间联合查询的操作。

分类:根据操作性质的不同,分为内连接和外连接,外连接又可以细分为左外连接和右外连接。除此之外,还有一种全连接操作,不过 MySQL 数据库并不支持。

定义解释比较抽象,下面我们通过实战来讲解这几种连接的区别,首先进入 MySQL 终端,首先创建一个测试数据库:

CREATE DATABASE mooc_demo;

创建一张测试表 test_a

DROP TABLE IF EXISTS `test_a`;

CREATE TABLE `test_a` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '数据库主键',
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `part` varchar(32) DEFAULT NULL COMMENT '部门'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后插入一些测试数据:

insert into test_a (`name`, `part`) values ('小明','文艺部');
insert into test_a (`name`, `part`) values ('小红','学习部');
insert into test_a (`name`, `part`) values ('小王','体育部');

继续创建另外一张测试表 test_b

DROP TABLE IF EXISTS `test_b`;

CREATE TABLE `test_b` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '数据库主键',
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `group` varchar(32) DEFAULT NULL COMMENT '小组'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入一些测试数据:

insert into test_b (`name`, `group`) values ('小明', '1号小组');
insert into test_b (`name`, `group`) values ('小红', '2号小组');
insert into test_b (`name`, `group`) values ('小李', '3号小组');

执行完成之后,两张表的数据如下:

图片描述

两张表数据

2.1 内连接

SQL 语法:inner join table_name on table_name

构建一条测试 SQL:select * from test_a a inner join test_b b on a.name = b.name;,执行结果如下图:

图片描述

内连接结果

执行结果解释:组装两张表满足 a.name = b.name 的查询结果。

我们以数据中的集合类比,表 test_a 和表 test_b 是两个数据集合,内连接则表示查询两个表都符合条件的数据,即集合的交集操作。
图片描述

集合交集

2.2 左连接

SQL 语法:...left join table_name on table_name

构建一条测试 SQL:select * from test_a a left join test_b b on a.name = b.name; ,执行结果如下图:

图片描述

左连接执行结果

执行结果解释:左连接(left join)是左外连接(left outer join)的简写,左连接会将左表(test_a)的所有记录都展示出来,而右表(test_b)只会展示符合搜索条件(上图中的 on condition)的搜索记录,其他记录以 NULL 作为补全。

即展示两个集合的交集以及左边集合的剩余部分数据:

图片描述

集合左交集

2.3 右连接

SQL 语法:right join table_name on table_name

构建一条测试 SQL:select * from test_a a right join test_b b on a.name = b.name; ,执行结果如下图:

图片描述

右连接执行结果

执行结果解释:右连接(right join)是右外连接(right outer join)的简写,右连接会将右表(test_b)的所有记录都展示出来,而左表(test_a)只展示符合后置条件(on condition)的记录展示,其他记录以 NULL 作为补全。

即展示两个集合的交集以及右边集合的剩余部分:

图片描述

集合右交集

3. 小结

SQL 查询可以拆分为两种情况,一种是单表查询,即根据 where 条件语句查询得到中间表,然后执行 select 语句选择需要的列返回给控制台。另一种是多表查询,对多张表求笛卡尔积,使用 on 语句作为连接条件得到中间表,之后还是通过 where 语句过滤中间表的记录,选择需要的列返回给控制台,本章节介绍的就是第二种查询方式。