实用指南:MySQL——联合查询数据表

news/2025/11/10 18:53:24/文章来源:https://www.cnblogs.com/tlnshuju/p/19207926

实用指南:MySQL——联合查询数据表

2025-11-10 18:49  tlnshuju  阅读(0)  评论(0)    收藏  举报

目录

一:本节目标

二: 简介

2.1 为什么要使⽤联合查询

2.2 多表联合查询时MYSQL内部是如何进⾏计算的

2.3 构造练习案例数据

2.4 案例:⼀个完整的联合查询的过程

三:内连接

3.1 语法

3.2实例

四: 外连接

4.1 语法

4.2 ⽰例

五:⾃连接

5.1 应⽤场景

5.2 ⽰例

5.3 表连接联系

六:⼦查询

6.1 语法

6.2 单⾏⼦查询

6.3 多⾏⼦查询

七: 合并查询

7.1 创建新表并初始化数据

7.2 Union

7.3 Union all


一:本节目标

了解联合查询的计算过程
掌握内连接、左外连接、右外连和⾃连接接查询
掌握⼦查询和合并查询
掌握插⼊查询结果和根据查询结果创建表

二: 简介

2.1 为什么要使⽤联合查询

在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询⼀个条数据的完整信息,就要从多个表中获取数据,如下图所⽰:要获取学⽣的基本信息和班级信息就要从学⽣表和班级表中获取,这时就需要使⽤联合查询,这⾥的联合指的是多个表的组合。

我们需要的是给用户呈现的是:
学生表的编号、姓名、性别、班级编号列、以及班级表的班级列
就是一次查询需要从多张表中获得数据,将成为联合查询(表连接查询)。

2.2 多表联合查询时MYSQL内部是如何进⾏计算的

参与查询的所有表取笛卡尔积,结果集在临时表中

观察哪些记录是有效数据,根据两个表的关联关系过滤掉⽆效数据

如果联合查询表的个数越多,表中的数据量越⼤,临时表就会越⼤,所以根据实际情况确定联合查询表的个数,大量的无效数据。

2.3 构造练习案例数据

- 1. 删除表(按外键依赖逆序:先删子表,再删父表)
DROP TABLE IF EXISTS score;
DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS class;
-- 2. 创建表(按依赖顺序:先父表,后子表)
-- 班级表(无外键依赖)
CREATE TABLE class (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL
);
-- 课程表(无外键依赖)
CREATE TABLE course (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL
);
-- 学生表(依赖 class)
CREATE TABLE student (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,sno VARCHAR(20) NOT NULL UNIQUE,age INT,gender TINYINT COMMENT '1: 男, 0: 女',enroll_date DATE,class_id INT,FOREIGN KEY (class_id) REFERENCES class(id)
);
-- 成绩表(依赖 student 和 course)
CREATE TABLE score (id INT PRIMARY KEY AUTO_INCREMENT,score DECIMAL(5, 2),student_id INT,course_id INT,FOREIGN KEY (student_id) REFERENCES student(id) ON DELETE CASCADE,FOREIGN KEY (course_id) REFERENCES course(id) ON DELETE CASCADE,UNIQUE KEY uk_student_course (student_id, course_id)
);
# 课程表
insert into course (name) values ('Java'), ('C++'), ('MySQL'), ('操作系统'), ('计
算机网络'), ('数据结构');
# 班级表
insert into class(name) values ('Java001班'), ('C++001班'), ('前端001班');
# 学生表
insert into student (name, sno, age, gender, enroll_date, class_id) values
('唐三藏', '100001', 18, 1, '1986-09-01', 1),
('孙悟空', '100002', 18, 1, '1986-09-01', 1),
('猪悟能', '100003', 18, 1, '1986-09-01', 1),
('沙悟净', '100004', 18, 1, '1986-09-01', 1),
('宋江', '200001', 18, 1, '2000-09-01', 2),
('武松', '200002', 18, 1, '2000-09-01', 2),
('李逹', '200003', 18, 1, '2000-09-01', 2),
('不想毕业', '200004', 18, 1, '2000-09-01', 2);
# 成绩表
insert into score (score, student_id, course_id) values
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
(60, 2, 1),(59.5, 2, 5),
(33, 3, 1),(68, 3, 3),(99, 3, 5),
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
(81, 5, 1),(37, 5, 5),
(56, 6, 2),(43, 6, 4),(79, 6, 6),
(80, 7, 2),(92, 7, 6);

2.4 案例:⼀个完整的联合查询的过程

查询学⽣姓名为孙悟空的详细信息,包括学⽣个⼈信息和班级信息
1:先确定要查询的表(学生,班级)
2:过滤无效数据(可以通过表名.列名的方式来指定那个表中的那个列参与比较)得到正确的结果
3:通过where条件进一步过滤结果。

4:进一步精减查询列表

 select student.id,student.name,student.sno,student.age,student.gender,student.enroll_date,class.name from student,class where student.class_id=class.id and student.name='孙悟空';

5:通过别名的查询

总结一下:
1:确定那几张表参与查询
2:根据表与表之间的关系,过滤掉无效数据
3:通过where条件进一步过滤结果
4:精简查询列表,得到想要的结果
5:通过为表起别名,精减查询语句

三:内连接

3.1 语法

select 字段 from 表1 别名1, 表2 别名2 where 连接条件 and 其他条件;
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 where 其他条件;(规范写法)
join两边分别是要链接的表,on后面就是链接条件

3.2实例

查询"唐三藏"同学的成绩

查询所有同学的总成绩,及同学的个⼈信息
先确定是哪几个表,所有同学的总成绩 那就要分组了(按照id 姓名都可以),然后使用聚合函数 sum加起来

对那个表的列求和,就对那个表的列分组。


Group by 使⽤了student.id进⾏分组,查询表列表中的student.name没有出现在Group by分组中,也没有包含在聚合函数中,这是因为SQL规定在Group by分组查询时,如果查询列表中的列没有出现在GROUP BY⼦句中,但这些列的值在每个分组内部是相同的,那么它们可以出现在查询结果中。

查询所有同学每⻔课的成绩,及同学的个⼈信息

因为一个学生有多门成绩 是一对多的关系,然后把学生和成绩表建立关系

然后把成绩和班级做关联。

四: 外连接

外连接分为左外连接、右外连接和全外连接三种类型,MySQL不⽀持全外连接。

左外连接:返回左表的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

右外连接:与左外连接相反,返回右表的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

全外连接:结合了左外连接和右外连接的特点,返回左右表中的所有记录。如果某⼀边表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

无论左外联还是右外连 必须找到基准表
左外连接,是以左表为基础
右外连接,是以右边为基础
基准表中的记录会被显示出来

4.1 语法

-- 左外连接,表1完全显⽰
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显⽰
select 字段 from 表名1 right join 表名2 on 连接条件;

4.2 ⽰例

查询没有参加考试的同学信息
查询那个表那个就是基准表

左外连接,以左表为基准值,左表中的记录全部显示
右表中如果没有匹配的字段,则用null填充。
不能用等号判断null。

查询没有学⽣的班级:
要查询的信息在那个表,那个就是基准表,我们要插班级表中没有没有被使用的,就是class
基准表中所有信息都会被显示

然后过滤

五:⾃连接

5.1 应⽤场景

⾃连接是⾃⼰与⾃⼰取笛卡尔积,可以把⾏转化成列,在查询的时候可以使⽤where条件对结果进⾏过滤,或者说实现⾏与⾏之间的⽐较。在做表连接时为表起不同的别名。
参与连接的两张是同一个表。

5.2 ⽰例

显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的成绩信息

1:先查出MySQL和JAVA的id:

再查询成绩表中,JAVA成绩⽐MySQL成绩好的信息

先过滤 然后判断

还有一种写法:

把4个表连接起来 起来,然后创建别名,对应关系一定要找对 :

然后可以直接输入名字:

直接判断大小:

5.3 表连接联系

显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的学⽣信息和班级以及成绩信息

# 相关的表全部加⼊连接,并确定连接条件
select stu.name as 姓名, c.name as 班级, s1.score as MySQL分数, s2.score as Java
分数 from
score s1,
score s2,
course c1,
course c2,
student stu,
class c
where
s1.student_id = s2.student_id
and
s1.course_id = c1.id
and
s2.course_id = c2.id
and
s1.score > s2.score
and
stu.id = s1.student_id
and
stu.class_id = c.id
and
c1.`name` = 'MySQL'
and
c2.`name` = 'Java';

首先还是确定表的关系 一定要把那个表和表的关系搞对。

六:⼦查询

⼦查询是把⼀个SELECT语句的结果当做别⼀个SELECT语句的条件,也叫嵌套查询。

6.1 语法

select * from table1 where col_name1 {= | IN} (
select col_name1 from table2 where col_name2 {= | IN} [(
select ...)
] ...
)

6.2 单⾏⼦查询

嵌套的查询中只返回⼀⾏数据
⽰例:查询与"不想毕业"同学的同班同学
查询学生的同班同学,student.class_id 相等
1:查出不想毕业的class_id
select  class_id  from  class where name = '不想毕业‘;
2:根据class_id查出学生表中学生信息
select * from student where class_id=(1);

6.3 多⾏⼦查询

嵌套的查询中返回多⾏数据,使⽤[NOT] IN关键字

⽰例:查询"MySQL"或"Java"课程的成绩信息

1:确定参与查询的表(课程、成绩)
2:先查询课程表中的课程信息(课程的id为1和3)

3:根据课程编号在分数表中查询对应的分数

4:把以上两个单独的查询合并为一条

 使⽤NOT IN 可以查询除了"MySQL"或"Java"课程的成绩

七: 合并查询

在实际应⽤中,为了合并多个select操作返回的结果,可以使⽤集合操作符 union,union all
把多个查询的结果集 合并在一起统一返回

7.1 创建新表并初始化数据

7.2 Union

该操作符⽤于取得两个结果集的并集。当使⽤该操作符时,会⾃动去掉结果集中的重复⾏。

⽰例:查询student表中 id < 3 的同学和student1表中的所有同学

重复的自动过滤

7.3 Union all

该操作符⽤于取得两个结果集的并集。当使⽤该操作符时,不会去掉结果集中的重复⾏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/961654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WORK 4

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/gjyycx/homework/14577 学号:102300321 姓名:陈传星//

2025年知识付费软件平台不踩坑:五星推荐创客匠人,知识店铺搭建/知识内容变现系统/在线教育SaaS平台/线上卖课平台/AI赋能和陪跑服务双保障

随着 AI 技术深度渗透与内容创业规模化发展,知识付费 SaaS 系统已从教育机构专属工具,逐步普及至培训讲师、企业创始人、垂直领域博主等多元群体,2025 年市场需求持续攀升。但行业扩张也带来产品功能同质化、服务落…

面向对象大作业之课程设计自主选题-第一次提交

一.使用Deepseek进行选题,选择了以教务管理系统为题。 二.做一个教务管理系统用来统计班级学生学号成绩;以下是示例: https://www.cnblogs.com/bigll666/p/10281813.html 实现的功能: 1.实现添加学生功能:班级、学…

2025年专升本教育机构综合评估与推荐,上海专升本机构/山东专升本机构/免试专升本机构推荐

当前专升本教育市场需求持续增长,考生对教育机构的教学质量、师资力量和课程体系要求不断提高。然而市场上培训机构水平参差不齐,部分机构存在师资力量薄弱、课程体系不完善、教学效果不达预期等问题,导致学生在选择…

啊?

2025.11.10 随记日常花絮,不建议当题解看。 事情的起因是模拟赛考了这么一道题: 。 他放在了 T2,我也场切了,所以我觉得这就是个简单贪心题。但是赛后讲评人说这个题等价于 NOIP2023 T3,由于我不太相信自己能场切…

Docker部署FileBrowser轻量网盘

本文在Ubuntu和威联通NAS演示了Docker部署FileBrowser轻量网盘的方法官网:Installation - File Browser filebrowser 是一款非常优秀的文件管理工具,并且是跨平台。安装也非常简单,安装后就可以使用,同样使用也非常…

2025/11/10~2025/11/16 做题笔记 - sb

2025/11/10 C. 圆环(circle) 感觉比 T2 要简单/kk dp 状态是好想的,非常明显可以设 \(f_{i, j}\) 表示当操作完 \(i\) 操作,另一只手在 \(j\) 位置的最小代价。这个东西的状态转移方程也不难。当由不是完成操作的手…

校园二手物品交易平台

校园二手物品交易平台——Java面向对象课程设计方案 组员名单:薛朝建、陈博凯、陈炤辉 一、AI工具辅助选题历程 在Java面向对象课程设计的选题阶段,我们借助多款AI工具提升决策效率:核心使用DeepSeek大模型开展选题…

pytorch、torchaudio、torchvideo版本对应关系

PyTorch版本 torchvision版本 torchaudio版本 2.5.0 0.20.0 2.5.0 2.4.1 0.19.1 2.4.1 2.4.0 0.19.0 2.4.0 2.2.1 0.17.1 2.2.1 2.2.0 0.17.0 2.2.0 2.1.0 0.16.0 2.1.0 …

【四级】全国大学英语四级历年真题及答案解析PDF电子版(2015-2025年6月) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

OpenGL进化史:从实验室到现代图形革命的里程碑之旅

OpenGL进化史:从实验室到现代图形革命的里程碑之旅 引言:为什么我们需要了解OpenGL的历史? OpenGL(Open Graphics Library)是计算机图形学的基石之一,驱动了从游戏到AI可视化、从虚拟现实到电影特效的无数创新。…

提示词语料收集

先开始收集常用的,不做分类,后期多了再分类处理 1、你是个XXXX,我是个菜鸟,用我能明白的方式向我解释一下YYY2、你个xxx,为我设计个yyy系统,并提供详细的编码实现与目录结构,完成设计后对你的设计进行评分,1分…

新手做幼儿园营养食谱公众号在哪找好看的素材?

如果你刚开始做幼儿园营养食谱的公众号,肯定会为找素材和排版发愁。其实,用对小工具就简单多了,比如小墨鹰编辑器,里面就有很多适合这个主题的素材。 第一步:先定一个“可爱又开胃”的基调在小墨鹰的模板中心,你…

C语言中的数据存储

1.数据类型 c语言自带的一些数据类型 char //字符型 1byte short //短整型 2byte int //整型 4byte long //长整型 4 or 8byte long long //更长的整型 8byte float…

咋提宣讲

不妨假设先手放在 \(1\) 号点,最后对每个点都做一遍即可。 \(N = 2\) 的时候先手必胜当且仅当 \(A_1 > A_2\)。 再难一点,\(1\) 的度数为 \(N - 1\) 时,考虑所有儿子的 \(A_i\) 的 \(\min\) 为 \(minn\),如果 \…

20232428 2025-2026-1 《网络与系统攻防技术》实验四实验报告

实验内容 一、恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶…

【模板】ccpc板子库

字符串 KMP #include<bits/stdc++.h> #define N 1000010 #define fo(a, b, c) for(int b = a; b <= c; b++) using namespace std; int n, m, b[N]; string s, t; int main(){ios::sync_with_stdio(0);cin.t…

20232428 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 实践内容 (1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程 (2)通过组合应用…