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. 精减查询结果字段

select
 student.id, 
 student.name, 
 student.sno, 
 student.age, 
 student.gender, 
 student.enroll_date, 
 class.name 
from student, class 
where
 student.class_id = class.id 
and
 student.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"成绩⾼的学⽣信息和班级以及成绩信息

在这里插入图片描述

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

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

相关文章

Win11右键默认显示更多选项

Win11默认显示 想要效果 解决方案1 先按住Shift键&#xff0c;再按右键试试。 解决方案2 1.启动命令行&#xff0c;输入命令 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve2.显示操作成功完成&#…

2024java高频面试之JVM-第二弹

什么是 STW Java 中「「Stop-The-World机制简称 STW」」 &#xff0c;是在执行垃圾收集算法时&#xff0c;Java 应用程序的其他所有线程都被挂起&#xff08;除了垃圾收集帮助器之外&#xff09;。「Java 中一种全局暂停现象&#xff0c;全局停顿」&#xff0c;所有 Java 代码…

子比美化 – WP添加网站翻译功能 | 实现国际化多语言[js翻译]

前言 本教程适用于子比主题&#xff0c;其它程序或主题请自行适配&#xff01;&#xff01;&#xff01; 图片展示 目前支持五种语言 教程开始 首先在后台自定义CSS代码中添加以下代码 .ignore:hover{color:var(--theme-color);transition:color .2s,transform .3s;}#tran…

怎么通过docker搭建一个mqtt服务器

由于debug需要排查mqtt的连接问题&#xff0c;为了方便&#xff0c;自己在云服务器上搭建一个mqtt服务器。 文中涉及的IP是虚构的IP&#xff0c;请替换成自己云服务器的IP&#xff0c;如有雷同&#xff0c;纯属巧合。 大致分为三部分&#xff1a; 一、安装docker 二、安装m…

cisco网络安全技术第3章测试及考试

测试 使用本地数据库保护设备访问&#xff08;通过使用 AAA 中央服务器来解决&#xff09;有什么缺点&#xff1f; 试题 1选择一项&#xff1a; 必须在每个设备上本地配置用户帐户&#xff0c;是一种不可扩展的身份验证解决方案。 请参见图示。AAA 状态消息的哪一部分可帮助…

<Project-11 Calculator> 计算器 0.2 工时计算器 WorkHours Calculator HTTP + JS

灵感 给工人发工资是按小时计算的&#xff0c;每次都要上网&#xff0c;我比较喜欢用 Hours Calculator &#xff0c;也喜欢它的其它的功能&#xff0c; 做个类似的。 我以为是 Python&#xff0c;结果在学 javascript 看 HTML&#xff0c;页面的基础还停留在 Frontpage 2000…

Cloudlog delete_oqrs_line 未授权SQL注入漏洞复现

0x01 产品简介 Cloudlog 是一个自托管的 PHP 应用程序,可让您在任何地方记录您的业余无线电联系人。使用PHP和MySQL构建的基于Web的业余无线电记录应用程序支持从HF到微波的一般站记录任务 0x02 漏洞概述 Cloudlog delete_oqrs_line 接口存在未授权SQL注入漏洞,未经身份验…

Marin说PCB之GMSL2 的Layout走线的注意事项

昨天有一位铁粉私信问我能不能讲解一下GMSL走线的一些注意事项啥的&#xff0c;我说当等我从以色列出差回来就给你更新一下这个&#xff0c;当然后来又很多的热心的粉丝提出很多的想法&#xff0c;我会一一给大家解答分享的&#xff0c;本期文章主要先给大家分享一下美信的手册…

[Python学习日记-50] Python 中的序列化模块 —— pickle 和 json

[Python学习日记-50] Python 中的序列化模块 —— pickle 和 json 简介 pickle 模块 json 模块 pickle VS json 简介 什么叫序列化&#xff1f; 序列化指的是将对象转换为可以在网络上传输或者存储到文件系统中的字节流的过程。序列化使得对象可以被保存、传输和恢复&#…

机器学习与神经网络:科技的星辰大海

前提 近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家&#xff0c;如今却将全球范围内对机器学习和神经网络的研究和开发作为了一…

基于K8S的StatefulSet部署mysql主从

StatefulSet特性 StatefulSet的网络状态 拓扑状态&#xff1a;应用的多个实例必须按照某种顺序启动&#xff0c;并且必须成组存在&#xff0c;例如一个应用中必须存在一 个A Pod和两个B Pod&#xff0c;且A Pod必须先于B Pod启动的场景 存储状态&#xff1a;应用存在多个实例…

ChatGPT01-preivew体验报告:内置思维链和多个llm组合出的COT有啥区别呢?丹田与练气+中学生物理奥赛题测试,名不虚传还是名副其实?

一个月前&#xff0c;o1发布的时候&#xff0c;我写了篇文章介绍 逻辑推理能力堪比博士生&#xff0c;OpenAI发布全新AI模型系列&#xff1a; o1 - 大模型或许进入新阶段&#xff0c;还翻译了官方的介绍 解密OpenAI o1是如何让LLMs获得逻辑推理能力的 - CoT * RL&#xff0c;也…

【Linux】多线程安全之道:互斥、加锁技术与底层原理

目录 1.线程的互斥 1.1.进程线程间的互斥相关背景概念 1.2.互斥量mutex的基本概念 所以多线程之间为什么要有互斥&#xff1f; 为什么抢票会抢到负数&#xff0c;无法获得正确结果&#xff1f; 为什么--操作不是原子性的呢&#xff1f; 解决方式&#xff1a; 2.三种加锁…

基于SpringBoot+Vue的厨艺交流系统的设计与实现(源码+定制开发)厨艺知识与美食交流系统开发、在线厨艺分享与交流平台开发、智能厨艺交流与分享系统开发

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

第五届人工智能与教育国际学术会议(ICAIE 2024)

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网&#xff1a;https://ais.cn/u/vEbMBz提交检索&#xff1a;EI Compendex、IEEE Xplore、Scopus 三、大会介绍 第五届人工智能与教育国际学术会议&#x…

java逻辑运算符 C语言结构体定义

1. public static void main(String[] args) {System.out.println(true&true);//&两者均为true才trueSystem.out.println(false|false);// | 两边都是false才是falseSystem.out.println(true^false);//^ 相同为false&#xff0c;不同为trueSystem.out.println(!false)…

【python爬虫实战】爬取全年天气数据并做数据可视化分析!附源码

由于篇幅限制&#xff0c;无法展示完整代码&#xff0c;需要的朋友可在下方获取&#xff01;100%免费。 一、主题式网络爬虫设计方案 1. 主题式网络爬虫名称&#xff1a;天气预报爬取数据与可视化数据 2. 主题式网络爬虫爬取的内容与数据特征分析&#xff1a; - 爬取内容&am…

蜜罐技术的出现究竟影响了什么

自网络诞生以来&#xff0c;攻击威胁事件层出不穷&#xff0c;网络攻防对抗已成为信息时代背景下的无硝烟战争。然而&#xff0c;传统的网络防御技术如防火墙、入侵检测技术等都是一种敌暗我明的被动防御&#xff0c;难以有效应对攻击者随时随地发起的无处不在的攻击和威胁。蜜…

IO多路复用概述与epoll简介

一、引言 在网络编程中&#xff0c;高并发的场景下处理大量连接请求是一项挑战。传统的阻塞式IO模型会让线程在等待数据的过程中陷入停顿&#xff0c;导致系统效率低下。为了解决这个问题&#xff0c;IO多路复用应运而生。它允许一个线程同时监听多个文件描述符&#xff08;如…

Gin框架操作指南02:JSON渲染

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…