【从删库到跑路 | MySQL总结篇】表的增删查改(进阶上)

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【MySQL学习专栏】🎈
本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

目录

  • 一、数据库约束类型
    • not null
    • unique
    • default
    • 主键约束
    • 外键约束
  • 二、表的设计
    • 一对一
    • 一对多
    • 多对多
  • 三、新增
  • 四、查询(进阶)
    • 聚合函数
    • 分组查询(group by)

一、数据库约束类型

约束:对数据库中的数据进行检查和校验,保证数据是有效、合法的。

约束是mysql提供的一个机制,辅助我们自动的依赖程序来对数据进行检查,检查我们想要修改的数据到底又不有效、合不合法,一旦检查出不合法或者无效数据,mysql就会进行报错。

以下是mysql的约束类型:

  • not null:指定某一列不能存储null值。
  • unique:保证某列的每一行必须是唯一的值(简单来说就是不同行的相同列不能重复)。
  • default:规定没有给列赋值时的默认值。
  • primary key(主键):
  • auto_increment:自增主键

not null

nut null演示:
在这里插入图片描述
在这里插入图片描述

unique

unique演示:
通过额外的查询操作来确保不会出现重复数据,当然这个查询操作肯定是要付出代价的(代价就是会消耗额外的时间)。在这里插入图片描述

default

default演示:

在这里插入图片描述

primary key演示:
在这里插入图片描述
主键一般是整数类型的id,一个表中只能有一个主键。mysql允许客户端再插入数据的时候不手动指定主键的值,而是交给mysql指定分配指定的值,这样可以保证分配出来的主键的值是不会出现重复的(分配方式就是按照自增的方式来分配主键的值;注意自增主键必须搭配i整数类型的主键去进行使用)。

主键约束

primary key auto_increment(自增主键)演示:
自增主键也可以自己手动设置,下次mysql分配的主键就会在之间最大值的基础上继续自增
自增主键可以设置为null值(因为自增主键是由mysql自行去分配给客户端的),但是主键不可以设置为null值。
在这里插入图片描述在这里插入图片描述
mysql会维护自增主键的这样一个最大值:
如果mysql是一个单个节点的系统,mysql是可以正常维护自增主键;
但是如果mysql是一个分布式系统,此时自增主键不能保证id的唯一性(因为每个主机上的mysql只知道自己存储的自增主键的最大值而不知道其它节点的情况,此时就有可能出现id重复的情况),所以要想分为这种表示唯一性的id的话,就不能依赖自增主键了。
所以了解决上述无法保证生成的id唯一性的问题,就出现了分布式id的生成算法,目的就是为了保证系统中的每个节点生成的id是唯一的。算法核心公式如下
把id作为一个字符串,这个字符串一般由三部分拼接成:①主机编号/机房编号;②时间戳;③随即因子(生成随机数)。此时生成的字符串格式的id就能够保证分布式系统下的唯一性了。

外键约束

foreign key(外键约束)演示:
创建外键约束的时候要明确谁(哪个表的哪一列)受到谁(哪个表的哪一列)的约束。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

外键约束建表语句样例:
// 创建外键约束的时候,父表的代码不受到影响,受到影响的是子表的代码。
 create table class(classId int primary key,className varchar(20)) charset utf8;
 insert into class values(1,'网页1班');
 insert into class values(2,'网页2班');
 insert into class values(3,'网页3班');
create table student(studentId int primary key auto_increment,name varchar(20),classId int,foreign key(classId) references class(classId)) charset utf8;

// 1.插入或者修改子表中受约束的这一列的数据就需要保证插入/修改后的结果得在父表中存在
// 以上述外键约束为例:在子表student插入的记录,其中的classId必须要在父表即class表中存在
// 针对这种外键约束的插入或者修改会触发查找操作在父表进行查询

// 2.删除或者修改父表中的数据需要看看这个记录是否在子表被使用了,如果被使用了则不能删除或者修改。
// 即约束通常是双向的

// 3.设置外键的时候就会导致我们在操作子表的时候频繁的查询父表(非常的耗时),如果id这一列有
// 索引的话就会一定程度提高查询速度,而primary key和unique是自带索引的。
// 同时mysql规定如果没有索引就不能设置外键

二、表的设计

现在我们讨论比较基础的设计表的方法原则。我们要设计数据库的表就需要先把实体关系梳理清楚。

关系就是实体与实体之间的关联关系。

关于数据库的关系有三种:一对一、一对多、多对多。

一对一

比如学校的教务系统,每个学生只能有一个教务系统账号,且这个教务系统账号只能归一个学生所有。

有三种建表方式来满足此场景的一对一的关系,请看:

// 方式一:
student(studentId,name,age,classId,......)
acount(accountId,username,password,studentId,......)

// 方式二:
student(studentId,name,age,acountId,......)
acount(accountId,username,password,......)

// 方式三:
student(studentId,name,username,password,......)

一对多

我们还是以学校的教务系统为例,比如一个同学只能存在于一个班级中,但是一个班级可以包含很多个同学。

满足此场景的建表方式如下:

class(classId,className)
		1		'网页一班'
		2		'网页二班'
student(studentId,name,classId)
			1	  '李白'  1
			2	  '杜甫'  1
			3	  '杜牧'  2
			

多对多

多对多中要想描述多对多的关系,一般都会引入一个关联表来进行描述。如下进行举例,请看:

student(studentId,name)
		1		 '李白'
		2		 '杜甫'
		3		 '唐僧'
course(courseId,coursename)
		101		'语文'
		102		'数学'
		103		'英语'
		104		'科学'
student_course(studentId,courseId)
				   1		102
				   1		101
				   1		103
				   2		102
				   2		103
				   3		101
				   3		102
				   3		103
				   3		104 

如果两张表之间没有任何关联关系,即两张表之间完全独立,互不影响。

三、新增

select into table_name [(column [,column,......])] select ......;
// select查询出来的结果需要和要插入的表能够匹配上(列的数目、类型、约束等)

举例如下:
在这里插入图片描述

四、查询(进阶)

聚合函数

聚合查询简单来说就是把行和行之间的数据进行运算(针对的是所有行进行运算)。

函数说明
count()[distinct] expr返回查询到的数据的数量
sum([distinct] expr)返回查询到的数据的总和(只针对数字)
avg([distinct] expr)返回查询到的数据的平均值(只针对数字)
max([distinct expr])返回查询到的数据的最大值(只针对数字)
min([distinct] expr)返回查询到的数据的最小值(只针对数字)

在sql中,聚合函数和空格是紧紧挨在一起的。

下面我们来进行举例,请看:


// 统计学生表中有多少个学上
select count(*) from student; // 方式一
select count(0) from student; // 方式二

// 统计学生表中的若干行。
select sum(chinese) from student; // 求和会把这一列的若干行按照double的方式进行累加

当我们把字符串类型的值进行相加的时候,就会出现下面这种情况,请看:
在这里插入图片描述
这里mysql起初想把每一行的数据转换为double类型的数据结果没有成功,但是并没有直接终止求和的操作,而是给我们提出了警告并把这个警告记录下来。
如果想查看当前的警告都有什么内容,可以输入下面的命令:
show warnings;
结果如下:
在这里插入图片描述

其它聚合函数
在这里插入图片描述

分组查询(group by)

group by子句:指定一个列,按照这个列进行分组(该列中,数值相同的行会被放在一组),每个分组中都可以按照聚合函数进行运算。

现在我们来看如下场景进行举例,请看:
在这里插入图片描述

// 注意事项
// 1.group by指定的列必须是select中指定的列
// 2.如果select中想要用到其它的列,那么其它的列必须搭配聚合函数来进行使用,否则直接查询出来的结果是没有意义的。请看举例2.


select role,avg(salary) from emp group by role; // 查询每个岗位的平均薪资,请看举例1。

// 分组查询当然也可以搭配条件来进行使用。比如分组之前的条件:where(请看举例3);分组之后的条件:having(请看举例4)。

举例1:
在这里插入图片描述

举例2:
在这里插入图片描述

举例3:
在这里插入图片描述

举例4:
在这里插入图片描述

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

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

相关文章

Android系统源码中添加可编译运行执行程序,C,C++

文章目录 Android系统源码中添加可编译运行执行程序,C,C1. 源码product分区中添加可执行程序 Android系统源码中添加可编译运行执行程序,C,C 1. 源码product分区中添加可执行程序 新建一个文件夹,以及一个test.cpp文…

自己动手实现一个深度学习算法——七、卷积神经网络

文章目录 1.整体结构2.卷积层1)全连接层存在的问题2)卷积运算3)填充4)步幅5)3维数据的卷积运算6)结合方块思考7)批处理 3.池化层1)池化层的特征 4.卷积层和池化层的实现1&#xff09…

Python实现FA萤火虫优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …

相机内存卡照片删除怎么恢复?没有备份可这样操作

在使用相机时,不小心删除了重要的照片可能是每位摄影爱好者的噩梦。然而,通过一些恢复方法,我们有机会挽救被删除的照片。本文将详细介绍相机内存卡照片删除恢复的方法。 图片来源于网络,如有侵权请告知 如果您误删了相机内存卡中…

easyExcel 注解开发 快速以及简单上手 以及包含工具类

easyExcel 简单快速使用 1. mevan 这里版本我这里选的是 poi 4.1.2和 ali的easyexcel 的 3.3.1。 因为阿里easy是根据poi的依赖开发的有关系,两者需要对应要不然就会有很多bug和错误在运行时发生。需要版本对应,然而就是easy的代码也会有bug这个版本是比…

代码随想录算法训练营第五十六天| 647. 回文子串 516.最长回文子序列

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 647. 回文子串 class Solution:def isPalindrome(self, string):left, right 0, len(string) - 1while left < right:if string[left] ! stri…

Python break用法详解

Python 语言没有提供 goto 语句来控制程序的跳转&#xff0c;这种做法虽然提高了程序流程控制的可读性&#xff0c;但降低了灵活性。为了弥补这种不足&#xff0c;Python 提供了 continue 和 break 来控制循环结构。本节先讲解 break 的用法。 某些时候&#xff0c;需要在某种…

力扣hot100 和为 K 的子数组 前缀和

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f37b; AC code class Solution {public int subarraySum(int[] nums, int k){int ans 0;int n nums.length;int[] s new int[n 1];// 前缀和s[0] 0;s[1] nums[0];for (int i 2; i < n; i)s[i] s[i - 1] nums[i - 1…

Linux文件操作应用及open和fork

1.文件操作的应用: 1).打开一个文件并往里面写入hello: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <assert.h> int main() { int fdopen("file.txt",O_WRONLY|O_CREAT,0600); …

解决Ruoyi-vue项目中接口请求超时的设置

背景&#xff1a; 有个几十亿的数据量的查询&#xff0c;查询时间超过40s&#xff0c;而Ruoyi-vue默认超过10s就拦截&#xff0c;因此需要修改默认超时时间 解决办法&#xff1a; 只需要打开request.js&#xff0c;把timeout设置扩大即可&#xff0c;默认是10000毫秒&#xff0…

6、Qt使用Log4Qt日志

一、知识点 1、Log4Qt有三部分 logger&#xff1a;负责捕获日志信息 layout&#xff1a;负责使用不同的样式输出日志 appender&#xff1a;负责输出信息到不同的目的地&#xff0c;比如数据库、文件、控制台等等 2、 日志级别如下&#xff0c;从上往下依次递增 ALL&#xff1a;…

线上问题整理-ConcurrentModificationException异常

项目场景&#xff1a; 商品改价&#xff1a;商品改价中通过多线程批量处理经过 Lists.partition拆分的集合对象 问题描述 商品改价中通过多线程批量处理经过 Lists.partition拆分的集合对象&#xff0c;发现偶尔会报 java.util.ConcurrentModificationException: nullat jav…

【密码学】【多方安全计算】不经意传输(Oblivious Transfer,OT)

文章目录 不经意传输&#xff08;oblivious transfer&#xff09;定义不经意传输的实例&#xff08;1 out 2&#xff0c;二选一不经意传输&#xff09;基于RSA的1 out 2 不经意传输疑问 不经意传输&#xff08;oblivious transfer&#xff09;定义 不经意传输&#xff08;obli…

开源运维监控系统-Nightingale(-夜莺)应用实践(未完)

一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…

【算法每日一练]-图论(保姆级教程 篇6(图上dp))#最大食物链 #游走

目录 题目&#xff1a;最大食物链 解法一&#xff1a; 解法二&#xff1a; 记忆化 题目&#xff1a;游走 思路&#xff1a; 题目&#xff1a;最大食物链 解法一&#xff1a; 我们标记f[i]是被f[x]捕食的点对应的类食物链数 不难得出&#xff1a; f[x]∑(f[i]) 首先从生…

Final project COMP 424, McGill University

Final project COMP 424, McGill University WeChat: zh6-86

电脑如何定时关机?

电脑如何定时关机&#xff1f;我承认自己是个相当粗心的人&#xff0c;尤其是在急于离开时经常会忘记关闭电脑&#xff0c;结果就是电量耗尽&#xff0c;导致电脑自动关机。而且&#xff0c;在我使用电脑的时候&#xff0c;经常需要进行软件下载、更新等任务。如果我一直坐等任…

XIAO ESP32S3之套件简绍

很高兴收到柴火创客空间寄来的XIAO ESP32S3开发套件。 一、套件介绍 1、电路板部分 一块XIAO ESP32S3主板、一块摄像头接口板&#xff08;可接SD卡&#xff09;&#xff0c;一根2.4G天线。 2、配件部分 一根USB-A转TypeC数据线、一个USB3.0转TypeC转接头、一个SD卡读卡器&am…

vue实战——登录【详解】(含自适配全屏背景,记住账号--支持多账号,显隐密码切换,登录状态保持)

效果预览 技术要点——自适配全屏背景 https://blog.csdn.net/weixin_41192489/article/details/119992992 技术要点——密码输入框 自定义图标切换显示隐藏 https://blog.csdn.net/weixin_41192489/article/details/133940676 技术要点——记住账号&#xff08;支持多账号&…

【WP】Geek Challenge 2023 web 部分wp

EzHttp http协议基础题 unsign 简单反序列化题 n00b_Upload 很简单的文件上传&#xff0c;上传1.php&#xff0c;抓包&#xff0c;发现php内容被过滤了&#xff0c;改为<? eval($_POST[‘a’]);?>&#xff0c;上传成功&#xff0c;命令执行读取就好了 easy_php …