1. 前言
多表查找,亦叫作为多表连接查找;做为关系型数据库最重点的查找方式,在平常工作中被广泛运用
平常的多表查找操作包括:子查找、内连接、左外连接、右外连接、完全连接、交叉连接
本篇文案将利用一个实例逐一介绍这些操作
2. 准备
以 Mysql 数据库为例,创建两张数据表:
student - 学生表
record - 选课记录表
其中,学生表 id 字段对应选课记录表中的 student_id 字段
Sql 如下: # 学生表:studentcreate table
student
( id int not null primary key
, name varchar(255) null
, age int null
) comment 学生表
; # 选课记录表:recordcreate table record
( id int not null primary key
, name varchar(255) not null
, student_id int not null
, time datetime null
) comment 选课记录
;
而后,向 2 张表中插进有些数据
# 学生表数据
1,张三,18
2,李四,23
3,王五,30
4,马六,35
5,孙七,40
6,朱八,19
7,黄九,53
# 记录表数据 2021001,语文,1,2021-01-18 15:32:472021002,数学,2,2021-01-18 15:33:412021003,英语,3,2021-01-18 15:34:012021004,理学,4,2021-01-18 15:34:332021005,体育,5,2021-01-18 15:34:472021006,化学,8,2021-01-18 15:35:122021007,生物,9,2021-01-18 15:35:392021008,音乐,10,2021-01-1815:36:00
3.1 子查找
子查找,又叫作之为内查找,是一种嵌套在其他 Sql 查找的 Where 子句中的查找
通常用于对查找结果的进一步限制,返回所必须的数据;子查找能够用在SELECT、INSERT、UPDATE 和 DELETE 语句中
这儿以 SELECT 语句为例,在两张表中运用子查找,筛选出满足条件的记录 # 子查找select * from student where id in (select student_id from record where student_id<=3
)
查找结果如下:
# 子查找的结果1
,张三,18 2
,李四,23 3
,王五,30)
必须重视的是,子查找必要包括在圆括号内,并且不可运用 ORDER BY 进行排序
3.2 内连接
内连接是经过关键字 inner join 连接两张表,只返回满足 on 要求的,两张表的交集数据 # 内连接select * from student s inner join record r on s.id=r.student_id;查找结果如下:
# 内连接查找结果 1,张三,18,2021001,语文,1,2021-01-18 15:32:472,李四,23,2021002,数学,2,2021-01-18 15:33:413,王五,30,2021003,英语,3,2021-01-18 15:34:014,马六,35,2021004,理学,4,2021-01-18 15:34:335,孙七,40,2021005,体育,5,2021-01-18 15:34:47
必须重视的是,倘若内连接无经过 on 关键字指定要求的话,查找结果和交叉连接查找结果同样,只是执行效率高于交叉连接
3.3 外连接
外连接包括:
左外连接
右外连接
其中,
左外连接:运用关键字 left join,以左表为准,返回左表的所有数据,右表满足 on 要求的数据会所有表示,否则用 null 值去填充
右外连接:和左外连接相反。运用关键 right join,以右表为准,返回右表的所有数据,左表满足 on 要求的数据会所有表示,否则用 null 值去填充
首要,咱们来看左连接的实例
# 左外连接select * from student s left join record r on
s.id=r.student_id;
返回结果如下:
# 左外连接结果 1,张三,18,2021001,语文,1,2021-01-18 15:32:472,李四,23,2021002,数学,2,2021-01-18 15:33:413,王五,30,2021003,英语,3,2021-01-18 15:34:014,马六,35,2021004,理学,4,2021-01-18 15:34:335,孙七,40,2021005,体育,5,2021-01-18 15:34:476,朱八,19,NULL,NULL,NULL,NULL7,黄九,53,NULL,NULL,NULL,NULL
而后,我们再来瞧瞧右连接 # 右外连接select * from student s right join record r on
s.id=r.student_id;
返回结果如下:
# 右外连接结果 1,张三,18,2021001,语文,1,2021-01-18 15:32:472,李四,23,2021002,数学,2,2021-01-18 15:33:413,王五,30,2021003,英语,3,2021-01-18 15:34:014,马六,35,2021004,理学,4,2021-01-18 15:34:335,孙七,40,2021005,体育,5,2021-01-18 15:34:47NULL,NULL,NULL,2021006,化学,8,2021-01-18 15:35:12NULL,NULL,NULL,2021007,生物,9,2021-01-18 15:35:39NULL,NULL,NULL,2021008,音乐,10,2021-01-18 15:36:00
3.4 完全连接
完全连接,是经过关键字 full join连接两张表,返回左表和右表的所有数据,并运用 null 值填充缺失的数据 # 完全连接select * from student s full join record r on
s.id = r.student_id;
必须重视的是,Mysql 并不支持完全连接,咱们能够运用左连接 + union + 右连接的方式去模拟完全连接 select * from student left join record on
student.id = record.student_id unionselect * from student right join record on
student.id = record.student_id;
查找结果如下:
# 完全连接结果1,张三,18,2021001,语文,1,2021-01-18 15:32:472,李四,23,2021002,数学,2,2021-01-18 15:33:413,王五,30,2021003,英语,3,2021-01-18 15:34:014,马六,35,2021004,理学,4,2021-01-18 15:34:335,孙七,40,2021005,体育,5,2021-01-18 15:34:476,朱八,19,NULL,NULL,NULL,NULL7,黄九,53,NULL,NULL,NULL,NULLNULL,NULL,NULL,2021006,化学,8,2021-01-18 15:35:12NULL,NULL,NULL,2021007,生物,9,2021-01-18 15:35:39NULL,NULL,NULL,2021008,音乐,10,2021-01-18 15:36:00
3.5 交叉连接
交叉连接,又叫作之为笛卡尔积,运用关键字 cross join 连接两张表进行查找
倘若不运用 where 加入限制要求,则返回两张表行数的乘积;倘若加入限制要求,则返回满足要求表达式的数据并合成一行
以加入限制要求的交叉连接查找为例 # 交叉连接select * from xag.student as s cross join xag.record as r where
s.id=r.student_id;
查找结果如下:
# 交叉连接结果 1,张三,18,2021001,语文,1,2021-01-18 15:32:472,李四,23,2021002,数学,2,2021-01-18 15:33:413,王五,30,2021003,英语,3,2021-01-18 15:34:014,马六,35,2021004,理学,4,2021-01-1815:34:335,孙七,40,2021005,体育,5,2021-01-18 15:34:47
必须重视的是,交叉连接查找倘若带有限制要求,它会先生成两张表行数成绩生成查找结果集,而后再经过限制要求去过滤;因此呢,在数据量大的时候,查找速度会很慢
4. 最后
相比单表查找,多表查找能够覆盖更加多业务场景,大大提高咱们的工作效率!实质工作其中,能够按照必须选取性的去运用!
|