当前位置: 首页 > news >正文

MySQL 数据库 【增删查改(二)】

目录

一、表的设计 

1、一对一

2、一对多 

3、多对多

二、新增

 三、查询

1、聚合查询

(1)聚合函数:

(2) group by 子句

(3)having

 2、联合查询

(1)内连接

(2)外连接 

(3)自链接

 (4)子查询

(5)合并查询

四、总结


一、表的设计 

此处只是讨论一些比较基本的设计表的方法原则

设计数据库的表,就需要先把实体和关系梳理清楚

实体:从需求场景中,提炼出一些 关键性 的名词(可以理解成Java中的对象)

关系:是实体和实体之间的 关联关系

数据库这里的关系只有四种:

1、一对一

一个人可以有一个身份证号

一个身份证号只能归一个人所有

这三种方法 都是可以的 


2、一对多 

 一个同学 只能存在于一个班级中

一个班级,可以包含多个同学

 这种设计方式,并不推荐

因为MySQL 这里的类型,并没有提供  '数组' 这样的类型

如果想要这么做,就需要按照一定的格式把多个 student 构造成一个字符串

这样的过程比较繁琐,也比较低效

但是有些数据库(redis)支持 数组 这样的类型,就可以采取上述的方法来设计了

按照 classId 来查询 student 就能够知道这个表里面的每个班级里包含哪些同学 


3、多对多

 一个同学 ,可以选择多门课程来学习

一门课程 ,也可以被多个同学来选择

 往往表示多对多关系,需要引入一个关联表


二、新增

把insert 和 select 两个操作合并在一起了

语法:

INSERT INTO table_name [(column [, column ...])] SELECT ...

 把 select 查询出来的结果数据,插入到另一个表中

我们先重新创建两个表 分别为 student 和 student2

并向 student 中插入三条数据:

 然后再运用上述语法,将 student 中的数据转移到 studen2 中

 此处 select 查询的记过 得和插入的表能对应(列的数目,类型,约束得匹配


 三、查询

1、聚合查询

表达式查询,本质上是在用 列 和 列 之间进行运算

还有的时候,我们需要进行 " 行 和 行 "之间的运算(聚合查询)

(1)聚合函数:

常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:  

 使用示例:

-- 统计数学成绩总分
SELECT SUM(math) FROM exam_result;-- 统计平均总分
SELECT AVG(chinese + math + english) 平均总分 FROM exam_result;、-- 返回英语最高分
SELECT MAX(english) FROM exam_result;-- 返回 > 70 分以上的数学最低分
SELECT MIN(math) FROM exam_result WHERE math > 70;

注意:在sql 中,要求聚合函数和 () 必须是紧紧挨在一起的

sum 是进行求和,会把这一列的若干行,按照 double 的方式进行累加。(会尝试把这一列的每一行的数据先转成 double ) 


(2) group by 子句

有的时候,希望把数据进行分组来进行计算,这个时候就要用到 group by 语句

group by 语句 是指定一个列,按照这个列进行分组,这一列中数值相同的行,会被放到一组

每个分组中,都可以使用上述的聚合函数来进行计算

我们重新创建一个员工表,并向其中插入几个数据:

现在,我们想统计每一个岗位的平均薪资,此时就可以使用 group by 子句 

 在分组查询中,select 指定的列,必须是当前group by 指定的列,如果select 想用到其它的列,其它的列必须放到聚合函数中,否则直接写,此时查询的结果无意义!!!


(3)having

分组查询,也是可以搭配条件来使用的

1、分组之前的条件: where

示例:求每个岗位的平均薪资,但是除掉张三

2、分组之后的条件 : having 

示例: 求每个岗位的平均薪资,但是除去平均薪资超过10000 的

分组之后的条件也是搭配聚合函数来使用的

 3、一个SQL 中,可以同时包含分组前的条件和分组后的条件

示例:求每个岗位的平均薪资,但是除掉张三和除去平均薪资超过10000 的


 2、联合查询

联合查询也叫做多表查询,是查询中最复杂的一种写法

联合查询就是给你多个表,结合多个表的数据,进行一些综合性更强的查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:

针对任意的两张表都可以计算笛卡尔积,但是一般来说,如果两个表没有任何的关系,那么计算的结果也是无意义的

笛卡尔积 就是把两个表里的记录 按照排列组合的方式 构成了一个更大的表

笛卡尔积的列数  就是原来两个表的列数之和

笛卡尔积的行数  就是原来两个表的行数之积 

笛卡尔积是一个非常低效的操作,尤其是表的本身的记录比较多的情况

同样的 多表联合查询也是非常低效的

因此在实际开发中,使用联合查询一定要慎重

计算笛卡尔积的时候,会出现一些不太靠谱的数据,如果此时我们加上链接条件,那么筛选出来的数据就都是合理的数据了


(1)内连接

语法:

select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;

我们现在有四张表,包含了三个实体:学生、班级、课程

其中包含的关系有:学生和班级:一对多的关系、学生和课程:多对多的关系

分数表,就相当于学生和课程之间的这个关联表

我们先使用学生表和班级表进行笛卡尔积

 此时可以看到,现在得到的这些结果就是笛卡尔积的结果

这个时候,如果 class_id 和 id 是一样的,那么我们就称这个数据是合法的数据

此时,我们的笛卡尔积在加上一些必要的条件后,就构成了多表联合查询

如果是单个表进行查询,条件中直接写列名即可

如果是多个表进行查询,条件中最好写作 ' 表名. 列名' 的形式,这是因为进行联合查询的这两个表里,有些列名可能是一样的,如果列名没有重复的,此时直接写列名也不是不可以,但是最好还是带上表名

示例:查询许仙同学的成绩

" 许仙 " 来自于 student 表 ,' 成绩 ' 来自于 score 表

(1)我们先把 score  表和 student 表进行笛卡尔积

(2)指定链接条件  此处是按照 学生id 进行筛选

(3)根据需求,进一步的添加条件  此处按照名字为 “ 许仙 ”再来进行筛选

(4)针对查询的结果的列,进行精简

 多表查询,本质上就是把所有的情况都类出来再筛选出合适的,因此,多表查询效率是比较低的

示例:查询所有同学的总成绩及个人信息

每个同学,可以有多门课程,这几门课的成绩,是按照行来组织的

(1) 两个表进行笛卡尔积

(2) 指定链接条件

(3) 这里要求的是每个学生的总成绩,就需要按照学生维度进行 group by

(4)  需要搭配聚合函数,针对分数进行进一步计算 

 示例:列出同学的名字,课程名字,分数

现在,我们需要通过 student , course , score 三张表进行联合查询

这里 student 和 course 是多对多的关系,score 是它们之间的一个关联表,因此三个表进行笛卡尔积筛选数据,就需要两个链接条件

此处进行三张表的笛卡尔积,由于此时的表比较小,所以执行笛卡尔积的过程其实是非常快的,但是此处显示了几秒才结束,这个是控制台打印的缘故 

此处能够写出链接条件 是因为这两个实体之间存在关联关系,如果是没有关系的两个表,这种条件就写不了

前面多个表,我们使用 逗号 来分割,现在使用 join 来分割,前面链接条件通过 where 指定,现在使用 on 来指定

 示例:查询许仙同学的成绩

(1)直接只写 join 没有 on 则是完整的笛卡尔积

(2)使用 on 表示链接条件

(3)结合需求,加上其它的条件

(4)针对 列 进行精简 

 


(2)外连接 

那么内连接和外连接有什么区别呢?

我们现在假设有这么两张表:

此时,左侧表的每一条记录,都能在右侧找到对应的,右侧表的记录也能在左侧找到 

此时针对这两个表,进行内连接和外连接,结果完全相同

当这两个表里面的数据对不上的时候,内连接就和外连接产生差别了

例如这种情况,此时王五同学在 score 表中没有数据, id 为 4的同学,在学生表中,也没有数据 

内连接的时候,产生的结果一定是两个表中都存在的数据(公共的部分)

 

 外连接,在MySQL 里,有两种情况,一种叫 左外连接 ,一种叫 右外连接 left join / right join

左外连接就是以左侧表为主,左侧表的每个记录, 都会存在于最终结果里,如果遇到了左侧表中存在,但是右侧表中不存在的数据,此时就会把对应的 列 填成空值(王五的成绩是空)

 

同理,右外连接就是以右侧的表为主,右侧表的每个记录,都会存在于最终结果里,如果遇到了右侧表中存在,左侧表中不存在的数据,也会把对应的列填成 NULL 

 

全外连接

这个操作,MySQL 不支持,但是Oracle 能支持 


(3)自链接

 自链接 本质上是自己和自己做笛卡尔积

本质是把 行 之间的关系,转换成 列 之间的关系

SQL 中,编写条件,条件都是 列 和 列 之间进行比较,但是SQL无法进行 行 和 行 之间的比较

示例:查询所有 “计算机原理” 成绩 比“Java”成绩高的成绩信息

(1)算出笛卡尔积

(2)加上链接条件,此处可以使用 学生id 作为链接条件,也可以使用 课程id 

(3)再加上进一步的业务中的条件,让左侧的表只保存 course_id = 3 的记录,同时,让右侧的表保存 course_id = 1的记录

(4)再针对列进行精简

score 表是按照 行 来组织多个课程的成绩的

因此,在这里 我们要将 行 转换成  列(把未知问题,转换成已知问题)

我们会发现,当直接对score 表及其自己进行笛卡尔积的时候,会进行报错

这是因为,select 的时候,多个表的名字不能相同,因此需要起一个别名,也是使用 as 起别名

 

这个时候,score 就可以进行笛卡尔积了

 最后的答案如下:


 (4)子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

本质上就是把多个SQL合并成一个SQL 

 示例:查询与 "不想毕业" 同学同班的同学 

分成两步完成,是比较推荐的做法 

 子查询就是将两个SQL语句合并在一起

SQL 支持这么写,但是并不建议,因为可读性低

IN 关键字

-- 使用IN
select * from score where course_id in (select id from course where
name='语文' or name='英文');-- 使用 NOT IN
select * from score where course_id not in (select id from course where
name!='语文' and name!='英文');

EXISTS 关键字

-- 使用 EXISTS
select * from score sco where exists (select sco.id from course cou 
where (name='语文' or name='英文') and cou.id = sco.course_id);-- 使用 NOT EXISTS
select * from score sco where not exists (select sco.id from course cou 
where (name!='语文' and name!='英文') and cou.id = sco.course_id);

(5)合并查询

 把多个 select 查询得到的结果合并成一个集合,关键字:union / union all

如果想要出现两个张三,可以使用 union all  

 能合并的前提是这两个查询的结果集的 列 得对应

之前学的 or 也是把一些结果合并起来,但是只能局限在一个表里里面

union 则是针对任意两个表的数据进行合并


四、总结

 

相关文章:

MySQL 数据库 【增删查改(二)】

目录 一、表的设计 1、一对一 2、一对多 3、多对多 二、新增 三、查询 1、聚合查询 (1)聚合函数: (2) group by 子句 (3)having 2、联合查询 (1)内连接 (2)外连接 (3)自链接 (4)…...

力扣 -- 978. 最长湍流子数组

一、题目 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:int maxTurbulenceSize(vector<int>& nums) {int nnums.size();vector<int> f(n);…...

甘特图 Dhtmlx Gantt

介绍 在一些任务计划、日程进度等场景中我们会使用到甘特图&#xff0c;Dhtmlx Gantt 对于甘特图的实现支持很友好&#xff0c;文档API介绍全面&#xff0c;虽然增强版的收费&#xff0c;但免费版的足以够用。 官网&#xff1a;https://docs.dhtmlx.com/gantt/ 安装dhtml gannt…...

iOS 应用上架流程详解

iOS 应用上架流程详解 欢迎来到我的博客&#xff0c;今天我将为大家分享 iOS 应用上架的详细流程。在这个数字化时代&#xff0c;移动应用已经成为了人们生活中不可或缺的一部分&#xff0c;而 iOS 平台的 App Store 则是开发者们发布应用的主要渠道之一。因此&#xff0c;了解…...

Python入门【LEGB规则、面向对象简介、面向过程和面向对象思想、面向对象是什么? 对象的进化 、类的定义、对象完整内存结构 】(十三)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…...

【消息中间件】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务

文章目录 视频演示效果前言一、分析二、全局注入MQTT连接1.引入库2.写入全局连接代码 二、PHP环境建立总结 视频演示效果 【uniapp】实现买定离手小游戏 前言 Mqtt不同环境问题太多&#xff0c;新手可以看下 《【MQTT】Esp32数据上传采集&#xff1a;最新mqtt插件&#xff08;支…...

【C语言初阶】指针篇—上

目录 1. 指针是什么&#xff1f;2. 指针和指针类型2.1 指针-整数2.2 指针的解引用 3. 野指针3.1 野指针成因1. 指针未初始化2. 指针越界访问3. 指针指向的空间释放 3.2 如何规避野指针 1. 指针是什么&#xff1f; 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; > 1…...

基于FasterRCNN深度学习网络的车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ....................................................................... % 训练Faster R-…...

机器学习深度学习——多层感知机

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——感知机 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 上一节…...

Django模型将模型注释同步到数据库

1、安装django-comment-migrate库 pip install django-comment-migrate 2、将库注册到settings.py文件中 INSTALLED_APPS [...django_comment_migrate, # 表注释... ] 3、加注释 3.1、给模型&#xff08;表&#xff09;加注释 在模型的class Meta中编辑 verbose_name&…...

STM32 Flash学习(二)

STM32F1的官方固件库操作FLASH的几个常用函数。这些函数和定义分布在源文件stm32f1xx_hal_flash.c/stm32f1xx_hal_flash_ex.c以及头文件stm32f1xx_hal_flash.h/stm32f1xx_hal_flash_ex.h中。 锁定解函数 对FLASH进行写操作前必须先解锁&#xff0c;解锁操作&#xff1a;在FLA…...

kotlin获取泛型集合的类型信息

通过 reified 关键字和内联函数来实现 inline fun <reified T> getClassFromList(list: List<T>): Class<T> {return T::class.java }fun main() {val list listOf("Hello", "World")val clazz getClassFromList(list)println(clazz)…...

AQS源码解析

关于 AQS&#xff0c;网上已经有无数的文章阐述 AQS 的使用及其源码&#xff0c;所以多这么一篇文章也没啥所谓&#xff0c;还能总结一下研究过的源码。源码解析和某某的使用&#xff0c;大概是互联网上 Java 文章中写得最多的主题了。 AQS AQS 是 AbstractQueuedSynchronize…...

关于在VS2017中编译Qt项目遇到的问题

关于在VS2017中编译Qt项目遇到的问题 【QT】VS打开QT项目运行不成功 error MSB6006 “cmd.exe”已退出,代码为 2。如何在VS2017里部署的Qt Designer上编辑槽函数 【QT】VS打开QT项目运行不成功 error MSB6006 “cmd.exe”已退出,代码为 2。 链接 如何在VS2017里部署的Qt Design…...

Python web实战 | 使用 Flask 实现 Web Socket 聊天室

概要 今天我们学习如何使用 Python 实现 Web Socket&#xff0c;并实现一个实时聊天室的功能。本文的技术栈包括 Python、Flask、Socket.IO 和 HTML/CSS/JavaScript。 什么是 Web Socket&#xff1f; Web Socket 是一种在单个 TCP 连接上进行全双工通信的协议。它是 HTML5 中的…...

Android10 Recovery系列(一)隐藏recovery菜单项

一 、背景 起因是遇到了一个隐藏删除recovery菜单项的需求。在寻找解决问题的时候,我经历了找到源码位置,调试修改,生效,思考是否可拓展,优化修改,符合要求的整个过程,下面简单分享一下。如果不想立即实现效果或者只想看解决方案,可以直接看总结那一个部分 二 、准备…...

选好NAS网络储存解决方案,是安全储存的关键

随着网络信息的发展&#xff0c;NAS也越来越受到企业的关注&#xff0c;NAS网络存储除了提供简单的存储服务外&#xff0c;还可以提供更好的数据安全性、更方便的文件共享方式。但市面上的产品种类繁多&#xff0c;我们该如何选择合适的产品&#xff0c;通过企业云盘&#xff0…...

AnimateDiff论文解读-基于Stable Diffusion文生图模型生成动画

文章目录 1. 摘要2. 引言3. 算法3.1 Preliminaries3.2. Personalized Animation3.3 Motion Modeling Module 4. 实验5.限制6. 结论 论文&#xff1a; 《AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning》 github: https://g…...

centos7安装tomcat

安装tomcat 必须依赖 JDK 环境&#xff0c;一定要提前装好JDK保证可以使用 一、下载安装包 到官网下载 上传到linux 服务器 二、安装tomcat 创建tomcat 文件夹 mkdir -p /usr/local/tomcat设置文件夹权限 chmod 757 tomcat将安装包上传至 新建文件夹 解压安装包 tar zx…...

【C#教程】零基础从入门到精通

今天给大家分享一套零基础从入门到精通&#xff1a;.NetCore/C#视频教程&#xff1b;这是2022年最新整理的、590G的开发教程资料。课程涵盖了.Net各方面的知识&#xff0c;跟着这个教程学习&#xff0c;就足够了。 课程分类 1、C#从基础到精通教程&#xff1b; 2、Winform从…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...