【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 字段 from 表1别名1 [inner] join 表2别名2 on 连接条件 and 其他条件;
select 字段 from 表1别名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 ;注意:查询的结果集合,列数 / 类型 / 顺序 要和 insert into 后面的表相匹配;列的名字不要求相同; create table student1(id int , …...
【医院运营统计专题】3.解码医院运营统计:目标、原则与未来蓝图
医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、医院运营统计的关键意义 在医疗行业持续发展与变革的大背景下,医院运营统计作为医院管理的关键组成部分,其重要性愈发凸显。从国内医院的普遍现状来看,运营统计已深度融入日常管理,为医院的有序运转提…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atomic_cmp_set 函数
目录 修正 执行 ./configure 命令时,输出: 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卷积神经网络双向长短期记忆神经网络多变量多步预测,光伏功率预测
代码地址:CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测,光伏功率预测 CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测 一、引言 1.1、研究背景和意义 光伏功率预测在现代电力系统中占有至关重要的地位。随着可再生能源…...
【YOLO系列】YOLOv5 NMS源码理解、更换为DIoU-NMS
代码来源:GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite 使用的代码是YOLOv5 6.1版本 参考笔记:YOLOv5改进系列(八) 更换NMS非极大抑制DIoU-NMS、CIoU-NMS、EIoU-NMS、GIoU-NMS 、SIoU-NMS、Soft-…...
Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1)
Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1) import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.HardwareRenderer import android.graphics.PixelFormat import android.graphic…...
【linux学习指南】线程同步与互斥
文章目录 📝线程互斥🌠 库函数strncpy🌉进程线程间的互斥相关背景概念🌉互斥量mutex 🌠线程同步🌉条件变量🌉同步概念与竞态条件🌉 条件变量函数 🚩总结 📝线…...
JavaScript函数与方法详解
目录 一、函数的定义 1. 函数声明 2. 函数表达式 3. 箭头函数 二、函数的调用 1. 调用方式 2. 参数数量的灵活性 三、arguments 对象 1. 基本概念 2. 属性 3. 应用场景 4. 转换为真数组 5. 总结 四、Rest参数 1. 基本概念 2. 特点 3. 应用场景 4. 总结 五、变…...
【论文笔记】ZeroGS:扩展Spann3R+GS+pose估计
spann3r是利用dust3r做了增量式的点云重建,这里zeroGS在前者的基础上,进行了增量式的GS重建以及进行了pose的联合优化,这是一篇dust3r与GS结合的具有启发意义的工作。 abstract NeRF和3DGS是重建和渲染逼真图像的流行技术。然而,…...
AtCoder - arc058_d Iroha Loves Strings解答与注意事项
链接:Iroha Loves Strings - AtCoder arc058_d - Virtual Judge 利用bitset这一数据结构,定义bitset类型的变量dp[i]表示第i到n个字符串能拼成的字符串长度都有哪些,比如00100101,表示能拼成的长度有0,2,5,࿰…...
企业使用统一终端管理(UEM)工具提高端点安全性
什么是统一终端管理(UEM) 统一终端管理(UEM)是一种从单个控制台管理和保护企业中所有端点的方法,包括智能手机、平板电脑、笔记本电脑、台式机和 IoT设备。UEM 解决方案为 IT 管理员提供了一个集中式平台,用于跨所有作系统和设备类型部署、配置、管理和…...
Leetcode 算法题 9 回文数
起因, 目的: 数学法。 % 求余数, 拆开组合,组合拆开。 这个题,翻来覆去,拆开组合, 组合拆开。构建的过程。 题目来源,9 回文数: https://leetcode.cn/problems/palindrome-number…...
设计模式Python版 命令模式(上)
文章目录 前言一、命令模式二、命令模式示例 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对象之间的组合&…...
C语言之循环结构:直到型循环
C语言 循环结构 直到型循环的实现 特点:先执行,后判断,不管条件是否满足,至少执行一次。典型代表:do…while,goto(已淘汰,不推荐使用) do…while 语法: 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 各帧切换: 2、地平线control tool实现切换命令 默认HDR模式出图: HCG出图: LCG出图 SPD出图 VS出图...
09-轮转数组
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 方法一:使用额外数组 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 风格前端页面示例,包含现代设计、响应式布局和常用功能: <template><div class"wiki-container"><!-- 头部导航 --><el-header class"wiki-header"><d…...
瑞芯微烧写工具
文章目录 前言一、安装驱动二、安装烧写工具1.直接解压压缩包2. 如何使用 三、MASKROM 裸机必备四、LOADER 烧写,前提是搞过第三步没问题五、Update.img包的烧录六、linux下烧写总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要…...
Windows风扇控制终极解决方案:FanControl深度配置指南
Windows风扇控制终极解决方案:FanControl深度配置指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa…...
为什么92%的SaaS团队在3个月内切换了语音服务商?——ElevenLabs与PlayAI在WebRTC集成、WebAssembly兼容性及低功耗端侧部署的实战踩坑全记录
更多请点击: https://intelliparadigm.com 第一章:语音合成服务商切换潮的底层动因解构 近年来,大量智能客服、有声阅读与车载交互系统密集启动 TTS(Text-to-Speech)服务商迁移项目。这一现象并非源于单一技术迭代&am…...
制造业备品备件管理痛点破解:磐石电气无人仓库解决方案
在制造业设备自动化、产线连续化运行需求日益提升的当下,备品备件、工装夹具、维修耗材及易损件等物资,已成为保障设备稳定运转、快速处置故障、降低非计划停机损失的核心支撑。尤其在电子制造、半导体、新能源、汽车零部件、电力电气等技术密集型行业&a…...
告别混乱:手把手教你用Python脚本整理ILSVRC2012验证集(附valprep.sh解析)
告别混乱:用Python脚本高效整理ILSVRC2012验证集 当你第一次打开ILSVRC2012验证集文件夹时,50000张图片杂乱堆放的场景可能让人头皮发麻——没有分类子目录,只有一堆以"ILSVRC2012_val_00000001.JPEG"命名的文件。这种原始结构与训…...
从CelebA数据集到落地应用:一份给新手的MTCNN训练数据制作与模型训练全指南
从CelebA数据集到落地应用:MTCNN训练数据制作与模型训练全指南 人脸检测作为计算机视觉的基础任务,其精度直接影响后续的人脸识别、表情分析等应用效果。MTCNN(Multi-task Cascaded Convolutional Networks)作为经典的多任务级联人…...
SAP资产会计进阶:深入理解AS91、AB01与ABLDT在期初数据处理中的角色与联动
SAP资产会计核心事务代码解析:AS91、AB01与ABLDT的协同逻辑与实战应用 在SAP S4 HANA资产模块的实施与运维中,期初数据处理往往是项目成败的关键节点。不同于日常资产操作,期初数据迁移涉及历史价值追溯、折旧逻辑重建以及多系统数据对齐等复…...
从微波炉到激光加工:手把手教你用COMSOL搞定4种电磁加热的仿真设置
从微波炉到激光加工:COMSOL电磁加热仿真实战指南 电磁加热技术早已渗透进现代工业与生活的每个角落——从家用微波炉的磁控管震荡,到新能源汽车电池的感应焊接,再到精密医疗器械的激光切割。这些看似迥异的应用背后,都遵循着相同…...
怎样从零构建高性能Voron 2.4 3D打印机:5个专业技巧全解析
怎样从零构建高性能Voron 2.4 3D打印机:5个专业技巧全解析 【免费下载链接】Voron-2 Voron 2 CoreXY 3D Printer design 项目地址: https://gitcode.com/gh_mirrors/vo/Voron-2 Voron 2.4是一款开源的CoreXY高速3D打印机,以其卓越的打印质量和专业…...
CentOS 7.9离线部署OnlyOffice踩坑全记录:从依赖包下载到SELinux配置的保姆级避坑指南
CentOS 7.9离线部署OnlyOffice全流程实战:从依赖包下载到SELinux配置的深度排错手册 在企业级生产环境中,离线部署文档协作平台往往面临比常规安装更复杂的挑战。本文将以CentOS 7.9为例,详细拆解OnlyOffice在完全离线环境下的部署全流程&…...
科研人狂喜!AI生成的位图可以转矢量图了
今天给大家分享我最近挖到的宝藏科研工具:MedPeer「图片创作」——国内领先的垂直领域AI科研绘图工具,刚好解决我们科研人最头疼的几个痛点。尤其是它的人工绘图转换服务,简直是帮我解决了大麻烦,必须给大家捋捋明白。我们科研人绘…...
