MySQL【知识改变命运】10

联合查询

  • 0.前言
  • 1.联合查询在MySQL里面的原理
  • 2.练习一个完整的联合查询
    • 2.1.构造练习案例数据
    • 2.2 案例:⼀个完整的联合查询的过程
      • 2.2.1. 确定参与查询的表,学⽣表和班级表
      • 2.2.2. 确定连接条件,student表中的class_id与class表中id列的值相等
      • 2.2.3. 加⼊查询条件
      • 2.2.4. 精减查询结果字段
      • 2.2.5. 可以为表名指定别名
    • 2.3联合查询总结:
  • 3.内连接
    • 3.1 语法
    • 3.2 示例
      • 3.2.1. 查询"唐三藏"同学的成绩
      • 3.2.2.查询所有同学的总成绩,及同学的个⼈信息
      • 3.2.3.查询所有同学的总成绩,及同学的个⼈信息
  • 4. 外连接
    • 4.1.语法
    • 4.2.查询没有参加考试的同学信息
    • 4.3.查询没有学⽣的班级
  • 5. ⾃连接
    • 5.1.应⽤场景
    • 5.2.显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的成绩信息
    • 5.3 表连接练习
      • 5.3.1.显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的学⽣信息和班级以及成绩信息

0.前言

前言:为什么要联合查询?什么是联合查询呢?
1:在学过范式之后,我们会对一张表的数据,按照范式的标准拆分为多张表,这样便于降低数据的冗杂,但是我们如果查询表的数据,我们又如何一次性查询所有的数据呢?这时候就用到了联合查询
2:联合查询就是多个表的组合查询,一次查询涉及两张或则两张以上的表,成为联合查询

1.联合查询在MySQL里面的原理

  • 参与查询的所有表笛卡尔积,结果集在临时表中
  • 实例:创建两张表,一张student 表,一张class表
    在这里插入图片描述
    插入数据
    在这里插入图片描述
    表如下:

在这里插入图片描述

  • 参与查询的所有表取笛卡尔积,结果集在临时表中:
    在这里插入图片描述
    在这里插入图片描述

• 观察哪些记录是有效数据,根据两个表的关联关系过滤掉⽆效数据
在这里插入图片描述
如果联合查询表的个数越多,表中的数据量越⼤,临时表就会越⼤,所以根据实际情况确定联合查询表的个数

2.练习一个完整的联合查询

2.1.构造练习案例数据

# 课程表
insert into course (name) values ('Java'), ('C++'), ('MySQL'), ('操作系统'), ('计
算机⽹络'), ('数据结构');
# 班级表
insert into class(name) values ('Java001班'), ('C++001班'), ('前端001班');
# 学⽣表
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);
# 成绩表
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);

2.2 案例:⼀个完整的联合查询的过程

• 查询学⽣姓名为宋江的详细信息,包括学⽣个⼈信息和班级信息

2.2.1. 确定参与查询的表,学⽣表和班级表

# 在from后同时写所有参与查询的表,并⽤逗号隔开(取笛卡尔积)
select *from student,class;

在这里插入图片描述
通过观察两张表联合后的结果集中,有些是无效的数据,如何过滤这些无用的数据呢?

2.2.2. 确定连接条件,student表中的class_id与class表中id列的值相等

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

在这里插入图片描述

  • 这里有个新的知识点,class_id在student表,但是两张表都有id列,不指定表名时MySQL无法分清要使用那张表的id列。这时候用表名.列名就可以区分。

2.2.3. 加⼊查询条件

在这里插入图片描述

  • 上面查询产生了一个错误,因为我们无法知道这个name是指代的是那张表的name。
  • 正确的写法如下:
    在这里插入图片描述

2.2.4. 精减查询结果字段

selectstudent.id, student.name, student.sno, student.age, student.gender, student.enroll_date, class.name 
from student, class 
wherestudent.class_id = class.id 
andstudent.name = '宋江';

在这里插入图片描述

2.2.5. 可以为表名指定别名

在这里插入图片描述

2.3联合查询总结:

  1. 确定几张表参与查询
  2. 根据表与表之间的关系,确定过滤条件
  3. 通过WHERE条件对整个结果集进行过滤
  4. 精减字段,得到想要的结果
  5. 通过为表起列名,精减SQL语句

3.内连接

3.1 语法

1 select 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;(简写)
2 select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 where 其他条件;(规范写法)

3.2 示例

3.2.1. 查询"唐三藏"同学的成绩

  1. 确定几张表:两张学生表和成绩表(取两张表的笛卡尔积)
select * from student,score;

在这里插入图片描述

  1. 根据表与表之间的关系,确定过滤条件
select * from student,score where student.id=score.student_id ;

在这里插入图片描述

  1. 添加where条件
    在这里插入图片描述
  2. 精减查询字段
select student.name,score.score from student,score where student.id=score.student_id and student.name='唐三藏';

在这里插入图片描述

  1. 通过起别名,精减整个sql语句
select s.name,sc.score from student s,score sc where s.id=sc.student_id and s.name='唐三藏';

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

  1. 用规范的写法写:
select s.name, sc.score from student s join score sc on sc.student_id = 
s.id where s.name = '唐三藏';

在这里插入图片描述
总结一下:
在这里插入图片描述

3.2.2.查询所有同学的总成绩,及同学的个⼈信息

select s.name,sum(sc.score) from student s join score sc on s.id=sc.student_id group by s.id;

在这里插入图片描述

  • 这里注意一下这个分组
  • 在这里插入图片描述

分组之后,列的值在组内是相同的,即使该列不是分组列(没有在group by指定),依然可以写在查询列表中。

3.2.3.查询所有同学的总成绩,及同学的个⼈信息

1.select * from student s join score sc on s.id=sc.student_id join course c on c.id=sc.course_id;
2.select * from student s,score sc,course c where c.id=sc.course_id and s.id=sc.student_id;

在这里插入图片描述

  • 切记关联查询表不要超过三张,在以后真正工作的时候不要做大表的表关联查询。

4. 外连接

• 外连接分为左外连接、右外连接和全外连接三种类型,MySQL不⽀持全外连接。
• 左外连接:返回左表的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。
• 右外连接:与左外连接相反,返回右表的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。
• 全外连接:结合了左外连接和右外连接的特点,返回左右表中的所有记录。如果某⼀边表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

4.1.语法

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

4.2.查询没有参加考试的同学信息

# 左连接以JOIN左边的表为基准,左表显⽰全部记录,右表中没有匹配的记录⽤NULL填充
select * from student s left join score sc on s.id=sc.student_id; 

在这里插入图片描述

  • 左表中显示所有记录,右边中没有与左表匹配的记录用NULL填充。
    添加where 条件
    在这里插入图片描述

4.3.查询没有学⽣的班级

# 右连接以JOIN右边的表为基准,右表显⽰全部记录,左表中没有匹配的记录⽤NULL填充
select * from student s right join class c on c.id=s.class_id; 

在这里插入图片描述
添加where条件过滤
在这里插入图片描述

5. ⾃连接

5.1.应⽤场景

⾃连接是⾃⼰与⾃⼰取笛卡尔积,可以把⾏转化成列,在查询的时候可以使⽤where条件对结果进⾏过滤,或者说实现⾏与⾏之间的⽐较。在做表连接时为表起不同的别名。

# 不为表指定别名
mysql> select * from score, score;
ERROR 1066 (42000): Not unique table/alias: 'score'
# 指定别名
mysql> select * from score s1, score s2;

5.2.显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的成绩信息

  • 首先分为两步进行,先要找到课程的id,java是1,MySQL是3

在这里插入图片描述

  • 确定连接条件
    两个表中的student_id 必须相等

在这里插入图片描述

  • 确定符合题目的要求
    要么sc1表中的course_id =1 且 sc2表中的course_id = 3
    要么sc1表中的course_id =3 且 sc2表中的course_id = 1
select  * from score sc1,score sc2 where sc1.student_id=sc2.student_id and sc1.course_id=1 and  sc2.course_id=3 ;

在这里插入图片描述

  • 加入结果集的过滤条件,分数比较
select  * from score sc1,score sc2 where sc1.student_id=sc2.student_id and sc1.course_id=1 and  sc2.course_id=3 and  sc1.score<sc2.score;

在这里插入图片描述
精减查询结果,用别名表示表头
在这里插入图片描述

5.3 表连接练习

5.3.1.显⽰所有"MySQL"成绩⽐"JAVA"成绩⾼的学⽣信息和班级以及成绩信息

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress 子比主题美化 四宫格 多宫格 布局插件

wordpress 主题美化 四宫格 多宫格 布局插件&#xff08;只在子比主题上测试过&#xff0c;其它主题没测试&#xff09; A5资源网四宫格布局插件是一个功能丰富的WordPress插件,专为创建自适应的四宫格布局而设计。这个插件具有以下主要特点: 灵活的布局: 支持1到8个宫格的自定…

Springboot整合knife4j生成文档

前言 在开发过程中&#xff0c;接口文档是很重要的内容&#xff0c;用于前端对接口的联调&#xff0c;也用于给其他方使用。但是手写相对比较麻烦。 当然也有swagger之类的&#xff0c;但是界面没有那么友好。 官网&#xff1a; 整合步骤 整合依赖 需要根据版本进行&…

如何使用 pnpm 进行打补丁patch操作?推荐两个方法

前言 作为一个前端开发者&#xff0c;我们每天都在和各种各样的库和依赖打交道。node_modules 目录中存放着我们项目的各种依赖。我们有时需要对其中的一些依赖进行修改&#xff0c;比如修复某个 bug 或者增加某些自定义功能。这时候&#xff0c;给 node_modules 打补丁就显得…

为您的 WordPress 网站打造完美广告布局 A5广告单元格插件

一个为 WordPress 网站量身定制的强大工具,它将彻底改变您展示广告的方式 灵活多变的布局设计 A5 广告单元格插件的核心优势在于其无与伦比的灵活性。无论您是想要创建整齐的网格布局,还是希望打造独特的不规则设计,这款插件都能满足您的需求。 自定义网格数量&#xff1a;从 2…

androidStudio编译导致的同名.so文件冲突问题解决

files found with path lib/arm64-v8a/libserial_port.so from inputs: ...\build\intermediates\library_jni\debug\jni\arm64-v8a\libserial_port.so C:\Users\...\.gradle\caches\transforms-3\...\jni\arm64-v8a\XXX.so 解决方式如下&#xff1a; 1.将gradle缓存文件删…

TwinCAT3安装 Advanced Motion Pack库

文章目录 一.简介二.安装方式1. 下载地址2. 双击下载好的安装包3. 选择语言&#xff08;只有英文和德语&#xff09;4. 点击Next5. 选择Accept6. 填写公司和组织名称&#xff08;随意&#xff09;7. 点击Install8. 等待安装完成9. 点击Finish 一.简介 TF5420 TC3 Motion Pick-…

深度学习-1:逻辑回归和梯度下降

逻辑回归 逻辑回归是一个二分分类问题 比如判断一张图片中是否是猫就是一个二类分类问题 图像由像素值组成&#xff0c;要将图像输入模型&#xff0c;就将其变为一个向量&#xff0c;该向量存储三个通道上的所有像素值&#xff0c;若图像尺寸为64x64x3&#xff0c;则向量维度…

RequestBody接收参数报错com.fasterxml.jackson.databind.exc.MismatchedInputException

目录&#xff1a; 1、错误现象2、解决办法3、最终验证 1、错误现象 报错的现象和代码如下&#xff1a; 2、解决办法 查了很多都说参数类型对不上&#xff0c;但是明明是对上的&#xff0c;没有问题&#xff0c;最后只有换接收方式后验证是可以的&#xff1b;最终想了一下&…

Unity3D 观察者模式

Unity3D 泛型事件系统 观察者模式 观察者模式是一种行为设计模式&#xff0c;通过订阅机制&#xff0c;可以让对象触发事件时&#xff0c;通知多个其他对象。 在游戏逻辑中&#xff0c;UI 界面通常会监听一些事件&#xff0c;当数据层发生变化时&#xff0c;通过触发事件&am…

网络参考模型总结

物理层&#xff1a; 电信号&#xff0c;有中继器、集线器等设备。 数据链路层&#xff1a;帧&#xff0c;有网桥、交换机等设备&#xff0c;通过mac地址。 网络层&#xff1a;包&#xff0c;有路由器等设备&#xff0c;通过IP地址。 传输层&#xff1a;段&#xff0c;有网…

rootless模式下istio ambient的流量管理测试

接上一篇rootless模式下istio ambient鉴权策略&#xff0c;本次测试管理流量的功能。 服务流量分割 Bookinfo应用程序有三个版本的reviews服务&#xff0c;接下来对这些版本进行分配流量控制测试。 longtdsubuntu:~$ kubectl get pod |grep reviews reviews-v1-746f96c9d4-2…

出类拔萃的四款录屏工具你pick哪一个?

在这个屏幕时代&#xff0c;录屏已经成为我们日常工作和娱乐中不可或缺的一部分。无论是为了记录游戏精彩瞬间&#xff0c;还是为了分享教程和经验&#xff0c;一个好的录屏工具都是必不可少的。今天&#xff0c;就让我为大家推荐几款电脑免费录屏工具&#xff0c;并分享一下使…

DDD通用语言、多尿和尿频-《分析模式》漫谈41

“Analysis Patterns”的第3章有这么一句&#xff1a; A patient with observations of the presence of thirst, weight loss, and polyuria indicates diabetes. 2004&#xff08;机械工业出版社&#xff09;中译本的译文为&#xff1a; 虽然没有完全使用类图&#xff08;类…

【C++_string类练习】仅仅反转字母

题目链接&#xff1a;仅仅反转字母 解题思路&#xff1a; 这种反转字符的题目我第一个想到的方法就是&#xff1a;双指针 一个指针在前start&#xff0c;一个指针在后back&#xff0c; 如果指针所指向的位置的值是字母&#xff0c;那么两个指针位置的值就进行交换&#xff0…

矿山企业电能智能化管理怎么实现

0引言 电力工业是国民经济和社会发展的基础&#xff0c;随着高质量发展要求的提升&#xff0c;提高能源效率对工业企业至关重要。有效提高电力能效的方法包括技术创新、监测用能行为和探索技术解决方案。智能化的电能管理是应对资源和环境压力的关键措施&#xff0c;对提高用电…

点餐小程序实战教程20广告管理

目录 1 创建数据源2 添加轮播容器3 创建变量4 绑定变量5 预览应用总结 一般餐厅需要有一些宣传&#xff0c;在我们的点餐页面可以在顶部加载广告位。广告主要是用轮播图的形式进行展示&#xff0c;本节我们介绍一下如果显示广告。 1 创建数据源 打开控制台&#xff0c;点击应用…

10-Docker安装Redis

10-Docker安装Redis Docker安装Redis 以 Redis 6.0.8 为例&#xff1a; docker pull redis:6.0.8直接pull会出现以下错误 [rootdocker ~]# docker pull redis:6.0.8 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request can…

【Cadence27】HDL拷贝工程➕Allegro导出DXF和3D文件STP

【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办&#xff1f; 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…

卸载 Git

目录 打开 Geek找到 Git右键卸载 Git卸载完成等待扫描注册表点击完成清除Git在本地的配置文件 打开 Geek 找到 Git 右键卸载 Git 卸载完成 等待扫描注册表 点击完成 已经删除完毕 清除Git在本地的配置文件 进入 C:\Users\用户名 删除框起来的配置文件 &#x1f447; 源码资料…

webpack自定义插件 ChangeScriptSrcPlugin

插件文件 class ChangeScriptSrcPlugin {apply(compiler) {const pluginName "ChangeScriptSrcPlugin";compiler.hooks.compilation.tap(pluginName, (compilation, callback) > {compilation.hooks.htmlWebpackPluginAlterAssetTags.tapAsync(pluginName,(html…