当前位置: 首页 > news >正文

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. 参与查询的所有表取笛卡尔积,结果集在临时表中
    在这里插入图片描述
  2. 观察哪些记录是有效数据,根据两个表的关联关系过滤掉无效数据在这里插入图片描述

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

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 查询学生姓名为孙悟空的详细信息,包括学生个人信息和班级信息

  1. 确定参与查询的表,为学⽣表和班级表
# 在from后同时写所有参与查询的表,并⽤逗号隔开
select * from student , class ;

在这里插入图片描述

  1. 确定连接条件,student表中的class_id与class表中id列的值相等
 #在where⼦句中加⼊连接条件select * from student , class where student.class_id=class.id;

在这里插入图片描述

  1. 加⼊查询条件

我们发现直接查询name时,导致MySQL不清楚到底是student的name还是class的name,此时我们要明确指定

在这里插入图片描述

# 明确指定——》这时可以⽤“表名.列号”的⽅式指定具体的列
select * from student , class where student.class_id=class.id and student.name ='孙悟空';

在这里插入图片描述

  1. 精减查询结果字段
select student.sno,student.name,student.age,class.name 
from student,class 
where student.class_id=class.id and student.name='孙悟空';

在这里插入图片描述

  1. 可以为表名指定别名
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 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;
# 2
select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 where 其他条件;

2.2 示例

  1. 查询"唐三藏"同学的成绩
select s.name, sc.score from student s join score sc on sc.student_id = s.sno where s.name = '唐三藏';

在这里插入图片描述

  1. 查询所有同学的总成绩,及同学的个人信息
# 内连接语法格式 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;

在这里插入图片描述

  1. 查询所有同学每⻔课的成绩,及同学的个⼈信息
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 示例

  1. 查询没有参加考试的同学信息
# 左连接以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;

在这里插入图片描述

  1. 查询没有学⽣的班级
# 查询没有学生的班级
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 示例

  1. 显示所有"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';

在这里插入图片描述

  1. 显⽰所有"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操作返回的结果,可以使⽤集合操作符unionunion 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之联合查询

前文我们了解到了数据库设计的范式要求&#xff0c;故生活中很多相互关联的数据被拆分开来&#xff0c;但彼此之间通过某种条件链接&#xff0c;此文联合查询就是通过多表之间的连接关系&#xff0c;来查询我们想要的数据&#xff0c;即 《联合查询》 1. 联合查询简介 1.1 为什…...

[C/C++] 定位新表达式 placement new

在C中&#xff0c;表达式 new (ptr) T(); 展示了一种特殊的内存分配和对象构造方式&#xff0c;这被称为定位新表达式&#xff08;placement new&#xff09;。 通常&#xff0c;当我们使用 new 关键字时&#xff0c;它会在堆上动态分配内存&#xff0c;并调用相应的构造函数来…...

【MySQL】MySQL的笛卡尔积现象是什么?简单说说

笛卡尔积好像是个科学家&#xff0c;也是个学术概念&#xff0c;在MySQL中表示交叉连接&#xff0c;即&#xff1a;匹配一切所有的可能 举例如下&#xff1a; 准备两张表 【employee表】 emp_idlast_namedept_id1Smith12Johnson2 【department表】 dept_iddepartment_nam…...

《InsCode AI IDE:编程新时代的引领者》

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

微搭低代码私有化部署搭建教程

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

【在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快很多&#xff0c;不仅如此&#xff0c;代码往往精简得多。 So, 这篇来讲讲进阶的广播和花哨索引操作&#xff0c;少写几个for循环&#xff08;&#xff09;。 目录 一个二维的例题 一个三维的例题 解法一 解法二 更难的三维例题…...

【Nginx】反向代理Https时相关参数:

在Nginx代理后台HTTPS服务时&#xff0c;有几个关键的参数需要配置&#xff0c;以确保代理服务器能够正确地与后端服务器进行通信。一些重要参数的介绍&#xff1a; proxy_ssl_server_name&#xff1a;这个参数用于指定是否在TLS握手时通过SNI&#xff08;Server Name Indicati…...

第 17 章 - Go语言 上下文( Context )

在Go语言中&#xff0c;context包为跨API和进程边界传播截止时间、取消信号和其他请求范围值提供了一种方式。它主要应用于网络服务器和长时间运行的后台任务中&#xff0c;用于控制一组goroutine的生命周期。下面我们将详细介绍context的定义、使用场景、取消和超时机制&#…...

Android Framework AMS(16)进程管理

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

STM32设计防丢防摔智能行李箱

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

【异常解决】Linux shell报错:-bash: [: ==: 期待一元表达式 解决方法

博主介绍&#xff1a;✌全网粉丝21W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

ML 系列: 第 23 节 — 离散概率分布 (多项式分布)

目录 一、说明 二、多项式分布公式 2.1 多项式分布的解释 2.2 示例 2.3 特殊情况&#xff1a;二项分布 2.4 期望值 &#xff08;Mean&#xff09; 2.5 方差 三、总结 3.1 python示例 一、说明 伯努利分布对这样一种情况进行建模&#xff1a;随机变量可以采用两个可能的值&#…...

Webpack 1.13.2 执行 shell 命令解决 打印时没有背景色和文字颜色的问题

这是因为 Webpack 1.13.2 不支持新的插件钩子 API。Webpack 1 的插件系统使用的是 plugin 方法&#xff0c;而不是 Webpack 4 中的 hooks。 在 Webpack 1 中&#xff0c;你可以使用以下代码来确保 sed 命令在打包完成后执行&#xff1a; const { exec } require(child_proce…...

C++构造函数详解

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

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、本地…...

【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看

文献&#xff1a;蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[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新建一个空项目 修改属性添加头文件路径和库路径 修改链接器&#xff0c;将OpenCV中lib库里的o…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...