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 语句过滤中间表的记录,选择需要的列返回给控制台,本章节介绍的就是第二种查询方式。