【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


在这里插入图片描述


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/969222.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法学习笔记之数学基础

例1&#xff08;最小公倍数与最大公约数&#xff09; 计算最小公倍数 公式&#xff1a; LCM(A,B) A*B/GCD(A,B) A与B的最小公倍数等于A*B除以A与B的最大公约数 计算最大公约数&#xff1a;辗转相除法 原理&#xff1a;设A与B的最大公约数为x&#xff0c;则A是x的倍数&am…

通过操作系统中的IO模型理解Java中的BIO,NIO,AIO

操作系统中的三种IO模型 阻塞I/O 先来看看阻塞 I/O&#xff0c;当用户程序执行 read&#xff0c;线程会被阻塞 一直等到内核数据准备好&#xff0c;并把数据从内核缓冲区拷贝到应用程序的缓冲区中&#xff0c;当拷贝过程完成&#xff0c;read 才会返回 注意&#xff1a;阻塞…

多项式插值(数值计算方法)Matlab实现

多项式插值&#xff08;数值计算方法&#xff09;Matlab实现 一. 原理介绍二. 程序设计1. 构建矩阵2. 求解矩阵方程3. 作出多项式函数4. 绘制插值曲线5. 完整代码 三. 图例 一. 原理介绍 关于插值的定义及基本原理可以参照如下索引 插值原理&#xff08;数值计算方法&#xff…

SpringMVC请求执行流程源码解析

文章目录 0.SpringMVC九大内置组件1.processRequest方法1.请求先到service方法2.然后不管是get还是post都会跳转到processRequest方法统一处理 2.doService方法3.doDispatch方法1.代码2.checkMultipart 4.核心流程 0.SpringMVC九大内置组件 1.processRequest方法 1.请求先到se…

在vivado中对数据进行延时,时序对齐问题上的理清

在verilog的ISP处理流程中&#xff0c;在完成第一个模块的过程中&#xff0c;我经常感到困惑&#xff0c;到底是延时了多少个时钟&#xff1f;今日对这几个进行分类理解。 目录 1.输入信号激励源描述 1.1将数据延时[9]个clk 1.2将vtdc与hzdc延时[9]个clk(等价于单bit的数据…

Spring 项目接入 DeepSeek,分享两种超简单的方式!

⭐自荐一个非常不错的开源 Java 面试指南&#xff1a;JavaGuide &#xff08;Github 收获148k Star&#xff09;。这是我在大三开始准备秋招面试的时候创建的&#xff0c;目前已经持续维护 6 年多了&#xff0c;累计提交了 5600 commit &#xff0c;共有 550 多位贡献者共同参与…

蓝桥杯-洛谷刷题-day5(C++)(为未完成)

1.P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 i.题目 ii.代码 #include <iostream> #include <string> using namespace std;int N, Na, Nb; //0-"剪刀", 1-"石头", 2-"布", 3-"蜥", 4-"斯"&#xff1…

MySQL - 索引 - 介绍

索引(Index)是帮助数据库高效获取数据的数据结构. 结构 语法 创建索引 creat [unique] index 索引名 on 表名 (字段名, ...); //创建唯一索引时加上unique, 多个字段用逗号隔开 查看索引 show index from 表名; 删除索引 drop index 索引名 on 表名;

2021年全国研究生数学建模竞赛华为杯E题信号干扰下的超宽带(UWB)精确定位问题求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 E题 信号干扰下的超宽带(UWB)精确定位问题 原题再现&#xff1a; 一、背景   UWB&#xff08;Ultra-Wideband&#xff09;技术也被称之为“超宽带”&#xff0c;又称之为脉冲无线电技术。这是一种无需任何载波&#xff0c;通过发送纳秒…

安装WPS后,导致python调用Excel.Application异常,解决办法

在使用xlwings编辑excel文件时&#xff0c;默认调用的是“Excel.Application”&#xff0c;如果安装过wps&#xff0c;会导致该注册表为WPS&#xff0c;会导致xlwings执行异常 因为安装过WPS&#xff0c;导致与Excel不兼容的问题&#xff0c;想必大家都听说过。有些问题及时删…

STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

前言 有需要帮忙代做51和32小车或者其他单片机项目&#xff0c;课程设计&#xff0c;报告&#xff0c;PCB原理图的小伙伴&#xff0c;可以在文章最下方加我V交流咨询&#xff0c;本篇文章的小车所有功能实现的代码还有硬件清单放在资源包里&#xff0c;有需要的自行下载即可&a…

机器学习所需要的数学知识【01】

总览 导数 行列式 偏导数 概理论 凸优化-梯度下降 kkt条件

singleTaskAndroid的Activity启动模式知识点总结

一. 前提知识 1.1. 任务栈知识 二. Activity启动模式的学习 2.1 standard 2.2 singleTop 2.3.singleTask 2.4.singleInstance 引言&#xff1a; Activity作为四大组件之一&#xff0c;也可以说Activity是其中最重要的一个组件&#xff0c;其负责调节APP的视图&#xff…

Java中使用EasyExcel

Java中使用EasyExcel 文章目录 Java中使用EasyExcel一&#xff1a;EasyExcel介绍1.1、核心函数导入数据导出数据 1.2、项目实际应用导入数据导出数据 1.3、相关注解ExcelProperty作用示例 二&#xff1a;EasyExcel使用2.1、导入功能2.2、导出功能 三&#xff1a;EasyExcel完整代…

WinForm 防破解、反编译设计文档

一、引言 1.1 文档目的 本设计文档旨在阐述 WinForm 应用程序防破解、反编译的设计方案&#xff0c;为开发团队提供详细的技术指导&#xff0c;确保软件的知识产权和商业利益得到有效保护。 1.2 背景 随着软件行业的发展&#xff0c;软件破解和反编译现象日益严重。WinForm…

基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践

目录 前言 1、研究背景 2、研究意义 一、研究目标 1、“地理难抵点”的概念 二、“难抵点”空间检索实现 1、数据获取与处理 2、计算流程 3、难抵点计算 4、WebGIS可视化 三、成果展示 1、华东地区 2、华南地区 3、华中地区 4、华北地区 5、西北地区 6、西南地…

Jenkins 部署 之 Mac 一

Jenkins 部署 之 Mac 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境&#xff0c;如果没有安装&#xff0c;先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装&#xff0c;终端输入命令:brew -v Mac安装HomeB…

AN 433:源同步接口的约束与分析

文章目录 简介时钟和数据的关系SDR&#xff08;单数据速率&#xff09;和 DDR&#xff08;双数据速率&#xff09;接口约束默认时序分析行为 源同步输出输出时钟输出时钟约束时钟电路和约束示例 以系统为中心的输出延迟约束输出最大延时输出最小延时 以系统为中心的输出时序例外…

webshell通信流量分析

环境安装 Apatche2 php sudo apt install apache2 -y sudo apt install php libapache2-mod-php php-mysql -y echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php sudo ufw allow Apache Full 如果成功访问info.php&#xff0c;则环境安…

docker学习---第3步:docker实操大模型

文章目录 1.Images2.Container3.DockerfileENTRYPOINT和CMDCOPY和ADDLABLE、EXPOSE和VOLUME卷中的数据是如何做数据备份的&#xff1f; ARG和ENVHEALTHCHECK 4. Network&#xff08;本节讲容器与容器之间的通信方案&#xff09; 跟着b站 胖虎遛二狗学习 Docker动手入门 &…