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

【MySQL — 数据库基础】深入解析 MySQL 的联合查询

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


1. 插入查询结果


语法


insert into table_name1 select* from table_name2 where restrictions ;

注意:查询的结果集合,列数 / 类型 / 顺序 要和 insert into 后面的表相匹配;列的名字不要求相同;


create table student1(id int , name varchar(20));create table student2(id int , name varchar(20));

要点讲解


1. 查询的结果集合,列数 / 类型 / 顺序要和 insert into 后面的表相匹配

insert into student1 values(1, '张三'), (2, '李四'), (100, '赵六');insert into student2 select* from student1 where id < 50;  -- 插入查询结果

在这里插入图片描述


2. 插入查询的表的列名,与插入的表列名不要求相同

drop table student2;create table student2(StudentId int , StudentName varchar(20));  -- 新创建的 student2 的列名和 student1 不同insert into student2 select* from student1 where id < 50;

在这里插入图片描述


3. 查询的结果集合,列数 / 类型 / 顺序和 insert into 后面的表不匹配,会报错
drop table student2;create table student2( StudentName varchar(20), StudentId int); -- 类型和 student1 不匹配insert into student2 select* from student1 where id < 50; 

在这里插入图片描述


4. 两个表的列类型不匹配,可以指定插入顺序,也可以指定查询顺序
insert into student2(StudentId, StudentName) select* from student1;  -- 指定插入顺序insert into student2 select name , id from student1;                 -- 指定查询顺序

2. 笛卡尔积


概念


笛卡尔积就像是把两个集合中的每一项都“配对”起来。

比如你有两个表,一个是人员名单,一个是产品清单

  • 人员名单:Alice 和 Bob
  • 产品清单:Apple 和 Banana

如果你把每个人和每个产品都配对一次,就得到以下组合:

  • Alice 和 Apple
  • Alice 和 Banana
  • Bob 和 Apple
  • Bob 和 Banana

这就是笛卡尔积的结果。


简单来说,就是把一个表的每一行和另一个表的每一行都组合一下: 笛卡尔积的列数,就是刚才两个表的列数之和; 笛卡尔积的行数,就是两张表行数的乘积。

所谓的 “多表联合查询”,是基于笛卡尔积这样的运算展开的;但注意,笛卡尔积很容易产生大量不需要的数据,所以一般要避免在查询中直接用它,除非有特别的需要。


在这里插入图片描述


通过SQL计算笛卡尔积


create table class(classId int, className varchar(20)); insert into class values
(1, '一班'), 
(2, '2班');create table student(id int , name varchar(20) , classId int );insert into student values
(1, '张三', 1) , 
(2, '李四', 1) , 
(3, '王五', 2) , 
(4, '赵六', 2) ;select* from student, class;  -- 通过 SQL 计算笛卡尔积,将两张表综合在一起进行查询

在这里插入图片描述


要想进行一些更有实际意义的查询,就需要指定一些额外的条件:


在笛卡尔积查询 student 和 class 时,我们期望进行笛卡尔积的记录是 classId 相同的记录
select* from student , class  where classId = classId ;  

在这里插入图片描述


为了解决" classId 是哪张表的 classId " 这个歧义,我们需要显式指定 classId 是属于哪张表的
select* from student , class  where student.classId = class.classId ; -- 使用成员访问运算符. 来指定 classId 是属于哪张表的

在这里插入图片描述


3. 一次完整的联合查询过程


构造数据

drop table if exists classes ;
drop table if exists student ;
drop table if exists course ;
drop table if exists score ;create table classes( id int primary key auto_increment , name varchar(20) , `desc` varchar(100) 
);create table student( id int primary key auto_increment, sn varchar(20) , name varchar(20) , qq_mail varchar(20) , class_id int 
) ;create table course( id int primary key auto_increment , name varchar(20) );create table score ( score decimal(3,1) , student_id int , course_id int ) ;-- 插入班级信息
insert into classes (name, `desc`) VALUES
('计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构和算法'),
('中文系2019级3班', '学习了中国传统文学'),
('自动化2019级5班', '学习了机械自动化');-- 插入学生信息
insert into student (sn, name, qq_mail, class_id) VALUES
('09982', '黑旋风李逵', 'xuanfengaqq.com', 1),
('00835', '菩提老祖', NULL, 1),
('00391', '白素贞', NULL, 1),
('00031', '许仙', 'xuxian@qq.com', 1),
('00054', '不想毕业', NULL, 1),
('51234', '好好说话', 'say@qq.com', 2),
('83223', 'tellme', NULL, 2),
('09527', '老外学中文', 'foreigner@qq.com', 2);-- 插入课程信息
insert into course (name) VALUES
('Java'), ('中国传统文化'), ('计算机原理'), ('语文'), ('高阶数学'), ('英文');-- 插入各个同学的课程相关的成绩信息
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),
-- tellme
(80, 7, 2), (92, 7, 6);

测试数据主要包含三个实体:学生,班级,课程;

学生 - 班级 属于一对多的关系,学生 - 课程 属于多对多的关系,所以我们需要通过一个关联表 score ,来体现课程和学生两个实体的联系;


内连接


语法


select 字段 from1别名1  [inner] join2别名2   on   连接条件 and 其他条件;
select 字段 from1别名1,2别名2  where 连接条件 and 其他条件;

在这里插入图片描述


案例


查询“许仙”同学的成绩

在这里插入图片描述


初学多表查询阶段,不建议一次写出最终的SQL语句,可以一步步的优化查询,根据规律写出最终SQL;


在这里插入图片描述


查询所有同学的总成绩及个人信息

在这里插入图片描述

select student.id , student.name , sum(score.score) 
from student, score 
where student.id = score.student_id 
group by student.id ;

在这里插入图片描述


查询所有同学的总成绩, 列出同学姓名,课程名字,课程分数....

在这里插入图片描述

select student.name as studentName , course.name as courseName , score.score 
from student , course , score 
where student.id = score.student_id and course.id = score.course_id ;

在这里插入图片描述


使用 join on 的方式查询,可以更好的体现出表两两之间的联合查询过程

select* from student 	
join score 
on student.id = score.student_id 
join course 
on score.course_id = course.id ;

在这里插入图片描述

select student.name as studentName , course.name as courseName , score .score 
from student 
join score on student.id = score.student_id 
join course on course.id = score.course_id ;  -- 精简查询

在这里插入图片描述


外连接


语法


外连接也是 join on 这样的写法,但是不支持 from 多个表 ;

外连接分为左外连接和右外连接;

如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。

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

案例


create table student( id int , name varchar(20) ) ;create table score( id int , score int ) ;insert into student values( 1 , '张三' ), ( 2 , '李四' ), ( 3 , '王五' );insert into score values(1 , 90) , (2 , 80) , (3 , 70) ;

创建的这张表的数据是一一对应的,进行内连接和外连接,得到的结果完全相同;

但是如果上述的数据不再一一对应,内连接的结果和外连接就会出现差别;

update score set id = 4 where score = 70 ;-- 修改数据

内连接
select name , score from student  ,   score where student.id = score.id;-- 这个写法只能表示内连接,不能表示外连接select name , score from student join score  on   student.id = score.id;select name , score from student inner join score  on   student.id = score.id;-- inner join 表示内连接,inner 关键字可以省略-- 内连接,查询结果只会包含两个表中同时具备的数据

在这里插入图片描述


外连接
select name , score from student left join score on student.id = score.id ;-- 左外连接select name , score from student right join score on student.id = score.id ;-- 右外连接

在这里插入图片描述


自连接


自连接是指在同一张表连接自身进行查询,这并不是常规操作,而是针对特殊的情况的处理;


案例


查询计算机组成原理分数高于 Java 的同学

在这里插入图片描述


select s1.student_id , s1.score , s2.score 
from score as s1, score as s2 
where s1.student_id = s2.student_id 
and s1.course_id = 3 
and s2.course_id = 1 
and s1.score > s2.score;


如果发现要查询的条件是针对两行,而不是两列,就可以考虑使用自连接进行转换; 自连接前要先清楚表的量级,如何表非常大,连接开销也会非常庞大,容易就把数据库搞死了.


子查询


子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询


单行子查询:返回一行记录的子查询

查询与“不想毕业”同学的同班同学:

在这里插入图片描述


多行子查询:返回多行记录的子查询

使用多行子查询,就不能使用= > <这样的运算符直接比较了,但是可以使用 in


查询“语文”或”“英文”课程的成绩信息:

在这里插入图片描述


合并查询


在实际应用中,为了合并多个select的执行结果,可以使用集合操作符union,union all。

使用 UNION 和 UNION ALL 时,前后查询的结果集中,字段需要一致(要求合并双方的类型,个数,顺序要相同,列名不要求相同)。


union


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


案例:查询id小于3,或者名字为“英文”的课程:select* from course where id < 3 union select* from course where name ='英文' ;-- 将两条SQL语句的查询结果一次性合在一张表中select* from course where id < 3 or name = '英文' ;-- 针对同一张表的查询, union 和 or 的效果相同,但是如果是不同的表,就只能用 union,不能用 or

在这里插入图片描述


union all


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

-- 查询id小于3,或者名字为“Java”的课程select* from course where id < 3 union all select* from course where name = 'Java' ;

在这里插入图片描述


SQL查询中各个关键字的执行先后顺序


from > on> join > where > group by > with > having > select > distinct > order by > limit


在这里插入图片描述


在这里插入图片描述

相关文章:

【MySQL — 数据库基础】深入解析 MySQL 的联合查询

1. 插入查询结果 语法 insert into table_name1 select* from table_name2 where restrictions ;注意&#xff1a;查询的结果集合&#xff0c;列数 / 类型 / 顺序 要和 insert into 后面的表相匹配&#xff1b;列的名字不要求相同&#xff1b; create table student1(id int , …...

【医院运营统计专题】3.解码医院运营统计:目标、原则与未来蓝图

医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、医院运营统计的关键意义 在医疗行业持续发展与变革的大背景下,医院运营统计作为医院管理的关键组成部分,其重要性愈发凸显。从国内医院的普遍现状来看,运营统计已深度融入日常管理,为医院的有序运转提…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atomic_cmp_set 函数

目录 修正 执行 ./configure 命令时&#xff0c;输出&#xff1a; checking for OS Linux 6.8.0-52-generic x86_64 checking for C compiler ... found using GNU C compiler gcc version: 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 所以当前环境是 x86_64 于是在 src…...

CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测,光伏功率预测

代码地址&#xff1a;CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测&#xff0c;光伏功率预测 CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测 一、引言 1.1、研究背景和意义 光伏功率预测在现代电力系统中占有至关重要的地位。随着可再生能源…...

【YOLO系列】YOLOv5 NMS源码理解、更换为DIoU-NMS

代码来源&#xff1a;GitHub - ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TFLite 使用的代码是YOLOv5 6.1版本 参考笔记&#xff1a;YOLOv5改进系列(八) 更换NMS非极大抑制DIoU-NMS、CIoU-NMS、EIoU-NMS、GIoU-NMS 、SIoU-NMS、Soft-…...

Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1)

Android RenderEffect对Bitmap高斯模糊(毛玻璃)&#xff0c;Kotlin&#xff08;1&#xff09; import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.HardwareRenderer import android.graphics.PixelFormat import android.graphic…...

【linux学习指南】线程同步与互斥

文章目录 &#x1f4dd;线程互斥&#x1f320; 库函数strncpy&#x1f309;进程线程间的互斥相关背景概念&#x1f309;互斥量mutex &#x1f320;线程同步&#x1f309;条件变量&#x1f309;同步概念与竞态条件&#x1f309; 条件变量函数 &#x1f6a9;总结 &#x1f4dd;线…...

JavaScript函数与方法详解

目录 一、函数的定义 1. 函数声明 2. 函数表达式 3. 箭头函数 二、函数的调用 1. 调用方式 2. 参数数量的灵活性 三、arguments 对象 1. 基本概念 2. 属性 3. 应用场景 4. 转换为真数组 5. 总结 四、Rest参数 1. 基本概念 2. 特点 3. 应用场景 4. 总结 五、变…...

【论文笔记】ZeroGS:扩展Spann3R+GS+pose估计

spann3r是利用dust3r做了增量式的点云重建&#xff0c;这里zeroGS在前者的基础上&#xff0c;进行了增量式的GS重建以及进行了pose的联合优化&#xff0c;这是一篇dust3r与GS结合的具有启发意义的工作。 abstract NeRF和3DGS是重建和渲染逼真图像的流行技术。然而&#xff0c;…...

AtCoder - arc058_d Iroha Loves Strings解答与注意事项

链接&#xff1a;Iroha Loves Strings - AtCoder arc058_d - Virtual Judge 利用bitset这一数据结构&#xff0c;定义bitset类型的变量dp[i]表示第i到n个字符串能拼成的字符串长度都有哪些&#xff0c;比如00100101&#xff0c;表示能拼成的长度有0,2,5&#xff0c;&#xff0…...

企业使用统一终端管理(UEM)工具提高端点安全性

什么是统一终端管理(UEM) 统一终端管理(UEM)是一种从单个控制台管理和保护企业中所有端点的方法&#xff0c;包括智能手机、平板电脑、笔记本电脑、台式机和 IoT设备。UEM 解决方案为 IT 管理员提供了一个集中式平台&#xff0c;用于跨所有作系统和设备类型部署、配置、管理和…...

Leetcode 算法题 9 回文数

起因&#xff0c; 目的: 数学法。 % 求余数&#xff0c; 拆开组合&#xff0c;组合拆开。 这个题&#xff0c;翻来覆去&#xff0c;拆开组合&#xff0c; 组合拆开。构建的过程。 题目来源&#xff0c;9 回文数&#xff1a; https://leetcode.cn/problems/palindrome-number…...

设计模式Python版 命令模式(上)

文章目录 前言一、命令模式二、命令模式示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对象之间的组合&…...

C语言之循环结构:直到型循环

C语言 循环结构 直到型循环的实现 特点&#xff1a;先执行&#xff0c;后判断&#xff0c;不管条件是否满足&#xff0c;至少执行一次。典型代表&#xff1a;do…while&#xff0c;goto&#xff08;已淘汰&#xff0c;不推荐使用&#xff09; do…while 语法&#xff1a; d…...

细说STM32F407单片机RTC的备份寄存器原理及使用方法

目录 一、备份寄存器的功能 二、示例功能 三、项目设置 1、晶振、DEBUG、CodeGenerator、USART6 2、RTC 3、NVIC 4、GPIO 及KEYLED 四、软件设计 1、main.h 2、main.c 3、rtc.c 4、keyled.c、keyled.h 五、运行调试 本实例旨在介绍备份寄存器的作用。本实例继续使…...

MATLAB计算反映热需求和能源消耗的度数日指标(HDD+CDD)(全代码)

目录 度数日(Degree Days, DD)概述计算公式MATLAB计算代码调用函数1:计算单站点的 CDD参考度数日(Degree Days, DD)概述 度数日(Degree Days, DD)是用于衡量建筑、城市和地区的热需求和能源消耗模式的指标。它分为两部分: 加热度日(Heating Degree Days, HDD):当室…...

J6 X8B/X3C切换HDR各帧图像

1、OV手册上的切换命令 寄存器为Ox5074 各帧切换&#xff1a; 2、地平线control tool实现切换命令 默认HDR模式出图&#xff1a; HCG出图&#xff1a; LCG出图 SPD出图 VS出图...

09-轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 方法一&#xff1a;使用额外数组 function rotate(nums: number[], k: number): void {const n nums.length;k k % n; // 处理 k 大于数组长度的情况const newNums new A…...

用vue3写一个好看的wiki前端页面

以下是一个使用 Vue 3 Element Plus 实现的 Wiki 风格前端页面示例&#xff0c;包含现代设计、响应式布局和常用功能&#xff1a; <template><div class"wiki-container"><!-- 头部导航 --><el-header class"wiki-header"><d…...

瑞芯微烧写工具

文章目录 前言一、安装驱动二、安装烧写工具1.直接解压压缩包2. 如何使用 三、MASKROM 裸机必备四、LOADER 烧写&#xff0c;前提是搞过第三步没问题五、Update.img包的烧录六、linux下烧写总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 项目需要…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

【Linux】Linux 系统默认的目录及作用说明

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

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本&#xff0c;sleep也是可以指定时间的&#xff0c;也就是说时间一到就会解除阻塞&#xff0c;继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒)&#xff0c;wait能被notify提前唤醒&#xf…...