MySQL之联合查询
前文我们了解到了数据库设计的范式要求,故生活中很多相互关联的数据被拆分开来,但彼此之间通过某种条件链接,此文联合查询就是通过多表之间的连接关系,来查询我们想要的数据,即 《联合查询》
1. 联合查询简介
1.1 为什么要使用联合查询
在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询⼀个条数据的完整信息,就要从多个表中获取数据,如下图所⽰:要获取学⽣的基本信息和班级信息就要从学⽣表和班级表中获取,这时就需要使⽤联合查询,这⾥的联合指的是多个表的组合。
1.2 多表联合查询时MYSQL内部是如何进行计算的
首先我们创建两个表,用于我们探讨问题
# 创建学生表
create table student (
id bigint,
name varchar(20),
sex char,
class_id bigint
);
insert into student value (1,'张三','男',1),(2,'李四','女',1),(3,'王五','男',2);#创建班级表
create table class (
id bigint,
name varchar(20)
);
insert into class value (1,'Java'),(2,'C++'),(3,'Python');
- 参与查询的所有表取
笛卡尔积
,结果集在临时表中
- 观察哪些记录是有效数据,根据两个表的关联关系过滤掉无效数据
如果联合查询表的个数越多,表中的数据量越大,临时表就会越大,所以建议根据实际情况确定联合查询表的个数
1.3 一个完整的联合查询过程
首先我们创建多个表,用于探讨联合查询过程
#课程表
create table course(
id bigint PRIMARY KEY auto_increment,
name varchar(10)
);
insert into course (name) values ('Java'), ('C++'), ('MySQL'), ('操作系统'), ('计算机⽹络'), ('数据结构');# 班级表
create table class (
id bigint,
name varchar(20)
);
insert into class value (1,'软件1班'),(2,'软件2班'),(3,'软件3班');#学生表
create table student (
name varchar(20),
sno varchar(10),
age int,
gender boolean,
enroll_date date,
class_id bigint
);
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);#成绩表
create table score (
score double,
student_id varchar(10),
course_id bigint
);
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);
1.3.1 查询学生姓名为孙悟空的详细信息,包括学生个人信息和班级信息
- 确定参与查询的表,为学⽣表和班级表
# 在from后同时写所有参与查询的表,并⽤逗号隔开
select * from student , class ;
- 确定连接条件,student表中的class_id与class表中id列的值相等
#在where⼦句中加⼊连接条件select * from student , class where student.class_id=class.id;
- 加⼊查询条件
我们发现直接查询name时,导致MySQL不清楚到底是student的name还是class的name,此时我们要明确指定
# 明确指定——》这时可以⽤“表名.列号”的⽅式指定具体的列
select * from student , class where student.class_id=class.id and student.name ='孙悟空';
- 精减查询结果字段
select student.sno,student.name,student.age,class.name
from student,class
where student.class_id=class.id and student.name='孙悟空';
- 可以为表名指定别名
select s.sno,s.name,s.age,c.name
from student s,class c
where s.class_id=c.id and s.name='孙悟空';
2. 内连接
2.1 语法
# 1
select 字段 from 表1 别名1, 表2 别名2 where 连接条件 and 其他条件;
# 2
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 where 其他条件;
2.2 示例
- 查询"唐三藏"同学的成绩
select s.name, sc.score from student s join score sc on sc.student_id = s.sno where s.name = '唐三藏';
- 查询所有同学的总成绩,及同学的个人信息
# 内连接语法格式 1
select s.* ,sum(sc.score) from student s,score sc where s.id=sc.student_id group by s.id;# 内连接语法格式 2
select s.* ,sum(sc.score) from student s join score sc on s.id=sc.student_id group by s.id;
- 查询所有同学每⻔课的成绩,及同学的个⼈信息
select s.* , sc.score,c.name from student s , score sc ,course c
where s.id=sc.student_id and sc.course_id=c.id;
3. 外连接
- 外连接分为左外连接、右外连接和全外连接三种类型,MySQL不支持全外连接
- 左外连接:返回左表的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则结果集中对应字段会显⽰为NULL
- 右外连接:与左外连接相反,返回右表的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则结果集中对应字段会显示为NULL
(MySQL中无论左外连接还是右外连接,实质都是先左外连接) - 全外连接:结合了左外连接和右外连接的特点,返回左右表中的所有记录。如果某一边表中没有匹 配的记录,则结果集中对应字段会显示为NULL
3.1 语法
-- 左外连接,表1完全显⽰
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显⽰
select 字段名 from 表名1 right join 表名2 on 连接条件;
3.2 示例
- 查询没有参加考试的同学信息
# 左连接以JOIN左边的表为基准,左表显示全部记录,右表中没有匹配的记录NULL填充
select s.id,s.name,s.sno,s.age,sc.* from
student s left join score sc on s.id=sc.student_id
where sc.score is null;
- 查询没有学⽣的班级
# 查询没有学生的班级
select c.*,s.id,s.name,s.age from
student s right join class c on s.class_id=c.id
where s.id is null;
4. 自连接
4.1 应用场景
==自连接是自己与自己取笛卡尔积,可以把行转化成列,在查询的时候可以使⽤where条件对结果进行过滤,或者说实现行与行之间的⽐较,在做表连接时为表起不同的别名。
# 不为表指定别名select * from score,score;
# 指定别名
select * from score s1, score s2;
4.2 示例
- 显示所有"MySQL"成绩比"JAVA"成绩高的成绩信息
select s1.* from score s1, score s2,
course c1,course c2
# 首先自连接中学生id要一样确保是同一个学生
where s1.student_id = s2.student_id
# MySQL课程
and s1.course_id = c1.id
# Java 课程
and s2.course_id = c2.id
# MySQL成绩大于Java成绩
and s1.score > s2.score
# 指定c1是MySQL,c2是Java
and c1.`name` = 'MySQL'
and c2.`name` = 'Java';
- 显⽰所有"MySQL"成绩比"JAVA"成绩⾼的学生信息和班级以及成绩信息
# 显示所有"MySQL"成绩比"JAVA"成绩高的成绩信息
select s1.* ,student.name,class.name from score s1, score s2,
course c1,course c2 ,student,class
# 首先自连接中学生id要一样确保是同一个学生
where s1.student_id = s2.student_id
# MySQL课程
and s1.course_id = c1.id
# Java 课程
and s2.course_id = c2.id
# MySQL成绩大于Java成绩
and s1.score > s2.score
# 指定c1是MySQL,c2是Java
and c1.`name` = 'MySQL'
and c2.`name` = 'Java'
# 学生的id对应相应的课程
and student.id=s1.student_id
# 学生的id对应相应的班级
and student.class_id=class.id;
5.子查询
子查询是把⼀个SELECT语句的结果当做别⼀个SELECT语句的条件,也叫嵌套查询
5.1 语法
select * from table1 where col_name1 {= | IN} (select col_name1 from table2 where col_name2 {= | IN} [(select ...)] ... )
5.2 单行子查询
嵌套的查询中只返回⼀行数据
- 示例:查询与"不想毕业"同学的同班同学
select * from student where class_id = (select class_id from student
where name = '不想毕业');
5.3 多行子查询
嵌套的查询中返回多⾏数据,使⽤[NOT]IN关键字
- 示例:查询"MySQL"或"Java"课程的成绩信息
select * from score where course_id in (select id from course where name = 'Java' or name = 'MySQL');
6.合并查询
在实际应⽤中,为了合并多个select操作返回的结果,可以使⽤集合操作符union
,union all
6.1 创建新表并初始化数据
# 创建⼀个新表并初始化数据create table student1 like student;# 插入测试数据insert into student1 (name, sno, age, gender, enroll_date, class_id) values
('唐三藏', '100001', 18, 1, '1986-09-01', 1),
('刘备', '300001', 18, 1, '1993-09-01', 3),
('张⻜', '300002', 18, 1, '1993-09-01', 3),
('关⽻', '300003', 18, 1, '1993-09-01', 3);
6.2 Union
该操作符⽤于取得两个结果集的并集。当使⽤该操作符时,会⾃动去掉结果集中的重复⾏。
- ⽰例:查询student表中id<3的同学和student1表中的所有同学
select * from student where id < 3 union select * from student1;
6.3 Union all
该操作符⽤于取得两个结果集的并集。当使⽤该操作符时,不会去掉结果集中的重复⾏。
select * from student where id < 3 union all select * from student1;
7.插入查询
7.1 语法
INSERT INTO table_name [(column [, column ...])] SELECT ...
7.2 示例
- 将student表中软件1班的学生复制到student1表中
# 插入查询结果
insert into student1 (name, sno, age, gender, enroll_date, class_id)
select s.name, s.sno, s.age, s.gender, s.enroll_date, s.class_id
from student s, class c where s.class_id = c.id and c.name = '软件1班';
# 验证是否查询结果插入成功
select * from student1;
相关文章:

MySQL之联合查询
前文我们了解到了数据库设计的范式要求,故生活中很多相互关联的数据被拆分开来,但彼此之间通过某种条件链接,此文联合查询就是通过多表之间的连接关系,来查询我们想要的数据,即 《联合查询》 1. 联合查询简介 1.1 为什…...
[C/C++] 定位新表达式 placement new
在C中,表达式 new (ptr) T(); 展示了一种特殊的内存分配和对象构造方式,这被称为定位新表达式(placement new)。 通常,当我们使用 new 关键字时,它会在堆上动态分配内存,并调用相应的构造函数来…...
【MySQL】MySQL的笛卡尔积现象是什么?简单说说
笛卡尔积好像是个科学家,也是个学术概念,在MySQL中表示交叉连接,即:匹配一切所有的可能 举例如下: 准备两张表 【employee表】 emp_idlast_namedept_id1Smith12Johnson2 【department表】 dept_iddepartment_nam…...

《InsCode AI IDE:编程新时代的引领者》
《InsCode AI IDE:编程新时代的引领者》 一、InsCode AI IDE 的诞生与亮相二、独特功能与优势(一)智能编程体验(二)多语言支持与功能迭代 三、实际应用与案例(一)游戏开发案例(二&am…...

微搭低代码私有化部署搭建教程
目录 1 下载远程工具2 查看服务器配置3 下载部署包4 安装部署包5 系统登录总结 最近微搭推出了私有化部署版本,正好官方赠送了我一台云服务器,练习一下部署的过程,本篇作为一个实践的记录 1 下载远程工具 一般我们使用的是云服务器ÿ…...

【在Linux世界中追寻伟大的One Piece】多路转接epoll(续)
目录 1 -> epoll的工作方式 1.1 -> 水平触发(Level Triggered)工作模式 1.2 -> 边缘触发(Edge Triggered)工作模式 2 -> 对比LT与ET 3 -> 理解ET模式和非阻塞文件描述符 4 -> epoll的使用场景 5 -> epoll示例 5.1 -> epoll服务器(LT模式) 5.2…...
【不写for循环】玩玩行列
利用numpy的并行操作可以比纯用Python的list快很多,不仅如此,代码往往精简得多。 So, 这篇来讲讲进阶的广播和花哨索引操作,少写几个for循环()。 目录 一个二维的例题 一个三维的例题 解法一 解法二 更难的三维例题…...
【Nginx】反向代理Https时相关参数:
在Nginx代理后台HTTPS服务时,有几个关键的参数需要配置,以确保代理服务器能够正确地与后端服务器进行通信。一些重要参数的介绍: proxy_ssl_server_name:这个参数用于指定是否在TLS握手时通过SNI(Server Name Indicati…...
第 17 章 - Go语言 上下文( Context )
在Go语言中,context包为跨API和进程边界传播截止时间、取消信号和其他请求范围值提供了一种方式。它主要应用于网络服务器和长时间运行的后台任务中,用于控制一组goroutine的生命周期。下面我们将详细介绍context的定义、使用场景、取消和超时机制&#…...

Android Framework AMS(16)进程管理
该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…...

STM32设计防丢防摔智能行李箱
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展,嵌入式系统、物联网技术、智能设备…...

【异常解决】Linux shell报错:-bash: [: ==: 期待一元表达式 解决方法
博主介绍:✌全网粉丝21W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

ML 系列: 第 23 节 — 离散概率分布 (多项式分布)
目录 一、说明 二、多项式分布公式 2.1 多项式分布的解释 2.2 示例 2.3 特殊情况:二项分布 2.4 期望值 (Mean) 2.5 方差 三、总结 3.1 python示例 一、说明 伯努利分布对这样一种情况进行建模:随机变量可以采用两个可能的值&#…...
Webpack 1.13.2 执行 shell 命令解决 打印时没有背景色和文字颜色的问题
这是因为 Webpack 1.13.2 不支持新的插件钩子 API。Webpack 1 的插件系统使用的是 plugin 方法,而不是 Webpack 4 中的 hooks。 在 Webpack 1 中,你可以使用以下代码来确保 sed 命令在打包完成后执行: const { exec } require(child_proce…...

C++构造函数详解
构造函数详解:C 中对象初始化与构造函数的使用 在 C 中,构造函数是一种特殊的成员函数,它在创建对象时自动调用,用来初始化对象的状态。构造函数帮助我们确保每个对象在被创建时就处于一个有效的状态,并且在不传递任何…...

POI实现根据PPTX模板渲染PPT
目录 1、前言 2、了解pptx文件结构 3、POI组件 3.1、引入依赖 3.2、常见的类 3.3、实现原理 3.4、关键代码片段 3.4.1、获取ppt实例 3.4.2、获取每页幻灯片 3.4.3、循环遍历幻灯片处理 3.4.3.1、文本 3.4.3.2、饼图 3.4.3.3、柱状图 3.4.3.4、表格 3.4.3.5、本地…...

【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看
文献:蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930. 本文目录 一、前言二、文献阅读-基于深度学习的复杂储层流体性质测井识别2.1 摘要2.2 当前研究不足2.3 本文创新2.4 论文…...

树的直径计算:算法详解与实现
树的直径计算:算法详解与实现 1. 引言2. 算法概述3. 伪代码实现4. C语言实现5. 算法分析6. 结论在图论中,树的直径是一个关键概念,它表示树中任意两点间最长路径的长度。对于给定的树T=(V,E),其中V是顶点集,E是边集,树的直径定义为所有顶点对(u,v)之间最短路径的最大值。…...

conda创建 、查看、 激活、删除 python 虚拟环境
1、创建 python 虚拟环境 ,假设该环境命名为 “name”。 conda create -n name python3.11 2、查看 python 虚拟环境。 conda info -e 3、激活使用 python 虚拟环境。 conda activate name 4、删除 python 虚拟环境 conda remove -n name --all 助力快速掌握数据集…...

vs2022搭建opencv开发环境
1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器,将OpenCV中lib库里的o…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...