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…...
NVIDIA NIM 开发者指南:入门
NVIDIA NIM 开发者指南:入门 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息?加入 NVIDIA 开发者计划,即可免费访问任何基础设施云、数据中心或个人工作站上最多 16 个 GPU 上的自托管 NVIDIA NIM 和微服务。 加入免费的 NVIDIA 开发者计…...
探索Python网络请求新纪元:httpx库的崛起
文章目录 **探索Python网络请求新纪元:httpx库的崛起**第一部分:背景介绍第二部分:httpx库是什么?第三部分:如何安装httpx库?第四部分:简单的库函数使用方法1. 发送GET请求2. 发送POST请求3. 超…...
学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着
ArcGIS水文分析实战教程(7)细说流域提取_汇流域栅格-CSDN博客 ArcGIS水文分析实战教程(6)河流提取与河网分级_arcgis的dem河流分级-CSDN博客 ArcGIS水文分析实战教程(5)细说流向与流量-CSDN博客 ArcGIS …...
QQ 小程序已发布,但无法被搜索的解决方案
前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过,上架后却一直无法被搜索到。打开后,再在 QQ 上下拉查看 “最近使用”,发现他出现一下又马上消失。 上线是按正常流程走的,开发、备案、审核,没有任何违规…...
【C++】拷贝构造 和 赋值运算符重载
目录: 一、拷贝构造 (一)拷贝函数的特点 二、赋值运算符重载 (一)运算符重载 (二)赋值运算符重载 正文 一、拷贝构造 如果一个构造函数的第一个参数是自身类类型的引用,且任何…...
21.UE5游戏存档,读档,函数库
2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档: 3.加载游戏,保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂,中间没有运行程序进行阶段性成果的验…...
「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号
本篇将继续讲解PTA平台上的题目 L1-005 考试座位号,通过考生准考证号与座位号的对应关系,掌握简单的数据查询与映射操作,进一步提升Cangjie编程语言的实际应用能力。 关键词 PTA刷题数据查询映射操作输入输出Cangjie语言 一、L1-005 考试座位…...
Vue3引用高德地图,进行位置标记获取标记信息
首先安装地图插件 cnpm i amap/amap-jsapi-loader --save封装地图子组件 <template><el-dialogtitle"选择地点"width"740px"class"select-map-dialog"v-model"dialogShow":close-on-click-modal"false":modal-or…...
《C++设计模式:重塑游戏角色系统类结构的秘籍》
在游戏开发领域,游戏角色系统的类结构设计至关重要。一个良好的类结构可以使游戏更易于扩展、维护和优化,而 C中的设计模式为我们提供了强大的工具来实现这一目标。 一、理解游戏角色系统的复杂性 游戏角色系统通常具有高度的复杂性。每个角色都有自己…...
深入浅出 Go 语言:现代编程的高效选择
深入浅出 Go 语言:现代编程的高效选择 引言 Go 语言(也称 Golang)是由 Google 开发的一种现代编程语言,面向高效、简单和并发。自 2009 年问世以来,它已迅速成长为许多企业和开发者首选的语言,尤其是在后端开发、云计算和微服务领域。 本文旨在从 Go 语言的设计哲学、…...
乌兰县wap网站建设公司/企业建设网站公司
https://ajax.loj.ac/problem/10000 活动安排( 本题采用贪心的方法:若希望有更多活动可以举行,就要找最早结束的活动。而并不是最早开始的,那样的话反例很容易就可以举出:一个从头到尾超长的活动.... #include<cstd…...
外国已经不把疫情当回事了/刷移动关键词优化
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼如何表示上级目录../表示源文件所在目录的上一级目录,../../表示源文件所在目录的上上级目录,以此类推。假设info.html路径是:c:\Inetpub\wwwroot\sites\blabla\info.html假设index.html路径是&a…...
好看的网站 你明白吗/上海关键词优化排名软件
题目描述 类Distance定义为类Point的友元类来实现计算两点之间距离的功能。 Point类中有两个私有数据成员X和Y来表示点的两个坐标(横坐标和纵坐标), 成员函数需要自己定义。 主程序输入两个Point点的坐标,计算两个点之间的距离。 类Distance的声明如下: class Dista…...
云南网站推广/谷歌推广公司哪家好
展开全部比如:现在是2004-03-26 13:31:40过去是:2004-01-02 11:30:24我现在要获得两个e5a48de588b662616964757a686964616f31333365633962日期差,差的形式为:XX天XX小时XX分XX秒方法…...
拼多多网站怎么做/企业网站建设推广
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和…...
网站客服电话/昆明seo关键词
理解 来源特权同学-https://www.eefocus.com/ilove314/blog/11-09/231507_10e01.htmlinout用法浅析有感于之前IIC通信中第一次使用verilog的inout端口,早就想写点什么。有些人可能会认为所谓的inout端口FPGA会自己处理,你要它做INPUT的时候从它读数据&am…...