【从删库到跑路 | 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	  '李白'  12	  '杜甫'  13	  '杜牧'  2

多对多

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

student(studentId,name)1		 '李白'2		 '杜甫'3		 '唐僧'
course(courseId,coursename)101		'语文'102		'数学'103		'英语'104		'科学'
student_course(studentId,courseId)1		1021		1011		1032		1022		1033		1013		1023		1033		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:
在这里插入图片描述

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

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

相关文章

Node.js入门指南(五)

目录 MongoDB 介绍 下载与启动 命令行交互 Mongoose 代码模块化 图形化管理工具 hello,大家好!上一篇文章我们介绍了express框架,这一篇文字主要介绍MongoDB。来对数据进行存储以及操作。 MongoDB 介绍 各位小伙伴应该多多少少都有接…

uniapp基础-教程之HBuilderX基础常识篇03

该内容为了大家更好的理解,将每个页面进行分离,单独创建项目,如在index中之写只写了一个搜索框,将其他页面分别放在HBuilderX目录中的components中,没有的可自行创建。 然后在components中创建轮播图新建一个swiper.v…

正则化与正则剪枝

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 引言正则化为什么会过拟合拉格朗日与正则化梯度衰减与正则化 应用解决过拟合网络剪枝 …

Linux篇:文件管理

一、共识原理: 1. 文件内容属性,内容与属性都是数据,都要在磁盘中保存。 2. 文件分为打开的文件和没打开的文件。 3. 研究打开的文件:本质是研究进程和文件的关系,因为是进程负责打开文件。 4. 没打开的文件在存储介质…

红黑树(万字图文详解)

红黑树 1. 红黑树的概念2. 红黑树的性质3. 红黑树节点的定义4. 红黑树结构5. 红黑树的插入操作5.1 按照二叉搜索的树规则插入新节点5.2 检测新节点插入后,红黑树的性质是否造到破坏5.2.1 情况一: cur为红,p为红,g为黑,u存在且为红…

智能优化算法应用:基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜻蜓算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

【springboot】宝塔简单部署springboot 配置https

宝塔简单部署springboot配置https 需求步骤1. springboot通过maven组件打成jar包2. 将jar包部署到宝塔上3. 下载安装nginx并创建网站节点4. 设置域名或者IP5. 设置反向代理:代理后端服务的ip和端口7. 配置SSL/TLS 需求 宝塔部署springboot项目,用nginx反向代理后端IP端口&…

深度学习黎明时期的LeNet:揭开卷积神经网络的序幕

在深度学习的历史长河中,Yann LeCun 的 LeNet 是一个里程碑式的研究成果,它为后来的卷积神经网络(Convolutional Neural Networks,CNN)的发展奠定了基础。LeNet 的诞生标志着深度学习黎明时期的到来,为人工…

【已解决】在windows下,gitlab修改了密码导致remote: HTTP Basic: Access denied

背景 网上好多答案遇到此问题都是修改凭证,故写此文。 在控制面板》用户账户》凭据管理器》管理windows凭据》普通凭据 --找到对应的git地址,编辑用户名和密码 本文解决方案适用于windows下没有凭证的情况,因修改密码导致下拉代码出错的情况。 Git是常…

Scrapy框架内置管道之图片视频和文件(一篇文章齐全)

1、Scrapy框架初识(点击前往查阅) 2、Scrapy框架持久化存储(点击前往查阅) 3、Scrapy框架内置管道 4、Scrapy框架中间件(点击前往查阅) Scrapy 是一个开源的、基于Python的爬虫框架,它提供了…

JAVA配置jdk17 Graa1VM

按照网上内容下载好对应的jdk17版本的Graa1VM, 解压后,修改环境变量中的JAVA_HOME为当前的目录,例如 D:\ruanjian\jdk\gra_jdk17\graalvm-ce-java17-22.3.0 。 然后在命令行中输入java -version的时候, 返回的并不是 Graa1VM 相关…

文件权限中 chmod、u+x、u、r、w、x分别代表什么

Linux系统中的每个文件和目录都有访问许可权限,如下面所示: 要说清楚问题,我们截取一些内容: ypyubuntu:~$ ls -l drwxr-xr-- 2 ypy ypy 4096 Nov 30 18:33 Desktop/ drwxr-xr-- 2 ypy ypy 4096 Nov 30 18:33 Documen…

【扩散模型】DDIM从原理到实战

DDIM从原理到实战 1. DDIM简介2. 实战DDIM2.1 载入一个预训练过的pipeline2.2 DDIM采样2.3 反转(invert) 3. 组合封装参考资料 DDPM过程的一个问题是在训练后生成图像的速度。当然,我们可能能够生成令人惊叹的图像,但生成一张图像…

本地训练,立等可取,30秒音频素材复刻霉霉讲中文音色基于Bert-VITS2V2.0.2

之前我们使用Bert-VITS2V2.0.2版本对现有的原神数据集进行了本地训练,但如果克隆对象脱离了原神角色,我们就需要自己构建数据集了,事实上,深度学习模型的性能和泛化能力都依托于所使用的数据集的质量和多样性,本次我们…

【密码学引论】序列密码

第五章 序列密码 1、序列密码 定义: 加密过程:把明文与密钥序列进行异或运算得到密文解密过程:把密文与密钥序列进行异或运算得到明文以字/字节为单位加解密密钥:采用一个比特流发生器随机产生二进制比特流 2、序列密码和分组密…

【docker】docker安装与优化

目录 一、安装Docker 1、关闭防火墙 2、安装依赖包 3、设置阿里云镜像源 4、安装Docker-CE社区版并设置为开机自启动 5、查看Docker信息 二、设置镜像加速 1、申请加速地址 2、实现加速操作 三、网络优化 1、如何网络优化 2、具体操作 四、docker-server端配置文件…

汇编实验2-2 查找匹配字符串笔记

一、数据段 1.字符串结尾:13,10,$ 2.设置格式控制字符串(这样就不用再写clrf函数了) 3.设置存关键字和句子的地址标签,以关键字为例 二、代码段 1.输入字符串 2.字符串比较 2.1 每次的比较长度,KLEN->CL 2.2 设置目标串起始…

【Linux系统编程】操作系统详解(什么是操作系统?为什么会存在操作系统?设计操作系统的目的是什么?)

目录 一、前言 二、 什么是操作系统 💦操作系统的引入 💦操作系统的概念理解 💦操作系统设计的目的与定位 💦总结 二、操作系统之上之下分别有什么 三、深度理解操作系统的“管理” 💦场景理解 💦操…

2023信息技术应用创新论坛|云轴科技ZStack分享云原生超融合在智慧交通的应用

11月25日,2023信息技术应用创新论坛在常州开幕。江苏省工业和信息化厅副厅长池宇、中国电子工业标准化技术协会理事长胡燕、常州市常务副市长李林等领导出席论坛并致辞。中国工程院院士郑纬民出席并作主题报告。来自产学研用金等各界的千余名代表参加本次论坛。 在“…

GitHub上8个强烈推荐的 Python 项目

文章目录 前言1. Manim2. DeepFaceLab3. Airflow4. GPT-25. XSStrike6. 谷歌图片下载7. Gensim8. SocialMapper总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③…