来源:AirPython
作者:星安果
多表查询,也称为多表连接查询;作为关系型数据库最主要的查询方式,在日常工作中被广泛使用
常见的多表查询操作包含:子查询、内连接、左外连接、右外连接、完全连接、交叉连接
本篇文章将利用一个实例逐一介绍这些操作
以 Mysql 数据库为例,创建两张数据表:
student - 学生表
record - 选课记录表
其中,学生表 id 字段对应选课记录表中的 student_id 字段
Sql 如下:
# 学生表:student
create table student
(
id int not null
primary key,
name varchar(255) null,
age int null
)
comment '学生表';
# 选课记录表:record
create 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:47
2021002,数学,2,2021-01-18 15:33:41
2021003,英语,3,2021-01-18 15:34:01
2021004,物理,4,2021-01-18 15:34:33
2021005,体育,5,2021-01-18 15:34:47
2021006,化学,8,2021-01-18 15:35:12
2021007,生物,9,2021-01-18 15:35:39
2021008,音乐,10,2021-01-18 15:36:00
子查询,又称之为内查询,是一种嵌套在其他 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
需要注意的是,子查询必须包含在圆括号内,并且不能使用 ORDER BY 进行排序
内连接是通过关键字 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:47
2,李四,23,2021002,数学,2,2021-01-18 15:33:41
3,王五,30,2021003,英语,3,2021-01-18 15:34:01
4,马六,35,2021004,物理,4,2021-01-18 15:34:33
5,孙七,40,2021005,体育,5,2021-01-18 15:34:47
需要注意的是,如果内连接没有通过 on 关键字指定条件的话,查询结果和交叉连接查询结果一样,只是执行效率高于交叉连接
外连接包含:
左外连接
右外连接
其中,
左外连接:使用关键字 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:47
2,李四,23,2021002,数学,2,2021-01-18 15:33:41
3,王五,30,2021003,英语,3,2021-01-18 15:34:01
4,马六,35,2021004,物理,4,2021-01-18 15:34:33
5,孙七,40,2021005,体育,5,2021-01-18 15:34:47
6,朱八,19,NULL,NULL,NULL,NULL
7,黄九,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:47
2,李四,23,2021002,数学,2,2021-01-18 15:33:41
3,王五,30,2021003,英语,3,2021-01-18 15:34:01
4,马六,35,2021004,物理,4,2021-01-18 15:34:33
5,孙七,40,2021005,体育,5,2021-01-18 15:34:47
NULL,NULL,NULL,2021006,化学,8,2021-01-18 15:35:12
NULL,NULL,NULL,2021007,生物,9,2021-01-18 15:35:39
NULL,NULL,NULL,2021008,音乐,10,2021-01-18 15:36:00
完全连接,是通过关键字 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
union
select * from student right join record on student.id = record.student_id;
查询结果如下:
# 完全连接结果
1,张三,18,2021001,语文,1,2021-01-18 15:32:47
2,李四,23,2021002,数学,2,2021-01-18 15:33:41
3,王五,30,2021003,英语,3,2021-01-18 15:34:01
4,马六,35,2021004,物理,4,2021-01-18 15:34:33
5,孙七,40,2021005,体育,5,2021-01-18 15:34:47
6,朱八,19,NULL,NULL,NULL,NULL
7,黄九,53,NULL,NULL,NULL,NULL
NULL,NULL,NULL,2021006,化学,8,2021-01-18 15:35:12
NULL,NULL,NULL,2021007,生物,9,2021-01-18 15:35:39
NULL,NULL,NULL,2021008,音乐,10,2021-01-18 15:36:00
交叉连接,又称之为笛卡尔积,使用关键字 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:47
2,李四,23,2021002,数学,2,2021-01-18 15:33:41
3,王五,30,2021003,英语,3,2021-01-18 15:34:01
4,马六,35,2021004,物理,4,2021-01-18 15:34:33
5,孙七,40,2021005,体育,5,2021-01-18 15:34:47
需要注意的是,交叉连接查询如果带有限制条件,它会先生成两张表行数成绩生成查询结果集,然后再通过限制条件去过滤;因此,在数据量大的时候,查询速度会很慢
相比单表查询,多表查询可以覆盖更多业务场景,大大提升我们的工作效率!实际工作当中,可以根据需要选择性的去使用!
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
持证人简介:贺渲雯 ,CDA 数据分析师一级持证人,互联网行业数据分析师 今天我将为大家带来一个关于用户私域用户质量数据分析 ...
2025-04-18一、CDA持证人介绍 在数字化浪潮席卷商业领域的当下,数据分析已成为企业发展的关键驱动力。为助力大家深入了解数据分析在电商行 ...
2025-04-17CDA持证人简介:居瑜 ,CDA一级持证人,国企财务经理,13年财务管理运营经验,在数据分析实践方面积累了丰富的行业经验。 一、 ...
2025-04-16持证人简介: CDA持证人刘凌峰,CDA L1持证人,微软认证讲师(MCT)金山办公最有价值专家(KVP),工信部高级项目管理师,拥有 ...
2025-04-15持证人简介:CDA持证人黄葛英,ICF国际教练联盟认证教练,前字节跳动销售主管,拥有丰富的行业经验。在实际生活中,我们可能会 ...
2025-04-14在 Python 编程学习与实践中,Anaconda 是一款极为重要的工具。它作为一个开源的 Python 发行版本,集成了众多常用的科学计算库 ...
2025-04-14随着大数据时代的深入发展,数据运营成为企业不可或缺的岗位之一。这个职位的核心是通过收集、整理和分析数据,帮助企业做出科 ...
2025-04-11持证人简介:CDA持证人黄葛英,ICF国际教练联盟认证教练,前字节跳动销售主管,拥有丰富的行业经验。 本次分享我将以教培行业为 ...
2025-04-11近日《2025中国城市长租市场发展蓝皮书》(下称《蓝皮书》)正式发布。《蓝皮书》指出,当前我国城市住房正经历从“增量扩张”向 ...
2025-04-10在数字化时代的浪潮中,数据已经成为企业决策和运营的核心。每一位客户,每一次交易,都承载着丰富的信息和价值。 如何在海量客 ...
2025-04-09数据是数字化的基础。随着工业4.0的推进,企业生产运作过程中的在线数据变得更加丰富;而互联网、新零售等C端应用的丰富多彩,产 ...
2025-04-094月7日,美国关税政策对全球金融市场的冲击仍在肆虐,周一亚市早盘,美股股指、原油期货、加密货币、贵金属等资产齐齐重挫,市场 ...
2025-04-08背景 3月26日,科技圈迎来一则重磅消息,苹果公司宣布向浙江大学捐赠 3000 万元人民币,用于支持编程教育。 这一举措并非偶然, ...
2025-04-07在当今数据驱动的时代,数据分析能力备受青睐,数据分析能力频繁出现在岗位需求的描述中,不分岗位的任职要求中,会特意标出“熟 ...
2025-04-03在当今数字化时代,数据分析师的重要性与日俱增。但许多人在踏上这条职业道路时,往往充满疑惑: 如何成为一名数据分析师?成为 ...
2025-04-02最近我发现一个绝招,用DeepSeek AI处理Excel数据简直太爽了!处理速度嘎嘎快! 平常一整天的表格处理工作,现在只要三步就能搞 ...
2025-04-01你是否被统计学复杂的理论和晦涩的公式劝退过?别担心,“山有木兮:统计学极简入门(Python)” 将为你一一化解这些难题。课程 ...
2025-03-31在电商、零售、甚至内容付费业务中,你真的了解你的客户吗? 有些客户下了一两次单就消失了,有些人每个月都回购,有些人曾经是 ...
2025-03-31在数字化浪潮中,数据驱动决策已成为企业发展的核心竞争力,数据分析人才的需求持续飙升。世界经济论坛发布的《未来就业报告》, ...
2025-03-28你有没有遇到过这样的情况?流量进来了,转化率却不高,辛辛苦苦拉来的用户,最后大部分都悄无声息地离开了,这时候漏斗分析就非 ...
2025-03-27