MySQL【知识改变命运】10

news2024/10/21 8:30:18

联合查询

  • 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"成绩⾼的学⽣信息和班级以及成绩信息

在这里插入图片描述

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

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

相关文章

【c++篇】:解析c++类--优化编程的关键所在(一)

文章目录 前言一.面向过程和面向对象二.c中的类1.类的引入2.类的定义3.类的封装和访问限定符4.类的作用域5.类的实例化6.类对象模型 三.this指针1.this指针的引出2.this指针的特性3.C语言和c实现栈Stack的对比 前言 在程序设计的广袤宇宙中&#xff0c;C以其强大的功能和灵活性…

[k8s理论知识]6.k8s调度器

k8s默认调度器 k8s调度器的主要职责&#xff0c;就是为一个新创建出来的pod寻找一个适合的节点Node。这包括两个步骤&#xff0c;第一&#xff0c;从所有集群的节点中&#xff0c;根据调度算法挑选出所有可以运行该pod的节点&#xff0c;第二&#xff0c;从第一步的结果中&…

Java项目-基于springboot框架的企业客户信息反馈系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

Windows环境下Qt Creator调试模式下qDebug输出中文乱码问题

尝试修改系统的区域设置的方法&#xff1a; 可以修复问题。但会出现其它问题&#xff1a; 比如某些软件打不开&#xff0c;或者一些软件界面的中文显示乱码&#xff01; 暂时没有找到其它更好的办法。

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…

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

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

3D Slicer 教程二 ---- 数据集

上一章下载3d slicer的软件,这章从加载数据集来弄清楚3dslicer怎么使用. 一. 加载数据集 如果没有数据集,也可用用样本数据. (1) "File" --> "add Data" 可以添加图片文件夹,(试了MP4不行,内镜的视频估计不支持),添加单个图片的话,会出现一些选项, …

C++贪心

前言 C算法与数据结构 打开打包代码的方法兼述单元测试 简介 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法策略。贪心算…

【设计模式系列】抽象工厂模式

一、什么是抽象工厂模式 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一个接口&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而无需指定它们具体的类。这种模式允许客户端使用抽象的接口来创建一组…

AUTOSAR_EXP_ARAComAPI的5章笔记(17)

☞返回总目录 相关总结&#xff1a;AutoSar AP CM通信组总结 5.7 通信组 5.7.1 目标 通信组&#xff08;Communication Group&#xff0c;CG&#xff09;是由 AUTOSAR 定义的复合服务模板。它提供了一个通信框架&#xff0c;允许在 AUTOSAR 应用程序之间以对等方式和广播模…

第6章 元素应用CSS作业

1.使用CSS对页面网页元素加以修饰&#xff0c;制作“旅游攻略”网站。 浏览效果如下&#xff1a; HTML代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>旅游攻略</title><link type"t…

[JAVAEE] 线程安全问题

目录 一. 什么是线程安全 二. 线程安全问题产生的原因 三. 线程安全问题的解决 3.1 解决修改操作不是原子性的问题 > 加锁 a. 什么是锁 b. 没有加锁时 c. 加锁时 d. 死锁 e. 避免死锁 3.2 解决内存可见性的问题 > volatile关键字 (易变的, 善变的) a. 不加…

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

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

git add操作,文件数量太多卡咋办呢,

git add介绍 Git的add命令是用于将文件或目录添加到暂存区&#xff08;也就是索引库&#xff09;&#xff0c;以便在后续的提交&#xff08;commit&#xff09;操作中一并上传到版本库的。具体来说&#xff0c;git add命令有以下几种常见用法&#xff1a; 添加单个文件&#…

4、.Net 快速开发框架:DncZeus - 开源项目研究文章

DncZeus 是一个基于 ASP.NET Core 和 Vue.js 的前后端分离的通用后台管理系统框架&#xff0c;其愿景是成为一个易于使用且功能丰富的 .NET Core 通用后台权限管理模板系统基础框架。项目名称 "DncZeus" 由 "Dnc"(.NET Core 的缩写)和 "Zeus"(古…

CLion和Qt 联合开发环境配置教程(Windows和Linux版)

需要安装的工具CLion 和Qt CLion下载链接 :https://www.jetbrains.com.cn/clion/ 这个软件属于直接默认安装就行&#xff0c;很简单&#xff0c;不多做介绍了 Qt:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/ window 直接点exe Linux 先c…

el-table动态新增/删除表单行及校验规则

方式一&#xff1a; <template><el-form ref"ruleFormRef" :model"ruleForm" :rules"rules" label-width"120px" class"model-ruleForm":size"formSize" status-icon label-position"top">…

堆的使用实例

小伙伴们大家好&#xff0c;今天为大家带来一道算法题&#xff1a; 分析题意我们可知&#xff1a;数组最小元素一定位于0~k位置&#xff0c;如果我们首先将0~k位置构成最小堆&#xff0c;那么堆顶一定就是数组最小值。将堆顶拿出&#xff0c;将数组k1位置放入&#xff0c;那么数…

无人机+视频推流直播EasyCVR视频汇聚/EasyDSS平台在森林防护巡检中的解决方案

随着科技的飞速发展&#xff0c;无人机技术在各个领域的应用日益广泛&#xff0c;特别是在森林防护与巡检方面&#xff0c;无人机以其独特的优势&#xff0c;为传统林业管理带来了革命性的变化。本文将探讨无人机在森林防护巡检中的解决方案&#xff0c;分析其工作原理、优势及…

MYSQL 拼接函数

目录 1、CONCAT 2、CONCAT_WS 1、CONCAT 解释&#xff1a;用于拼接两个或多个字符串成一个字符串。如果任何一个参数为 NULL&#xff0c;则 CONCAT 函数的结果也会是 NULL。 语法格式&#xff1a;SELECT concat(column_name1,column_name2,...) FROM table_name 中文注释&…