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

news2024/11/26 21:32:49

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【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:
在这里插入图片描述

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

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

相关文章

数据增强让模型更健壮

在做一些图像分类训练任务时,我们经常会遇到一个很尴尬的情况,那就是: 明明训练数据集中有很多可爱猫咪的照片,但是当我们给训练好的模型输入一张戴着头盔的猫咪进行测试时,模型就不认识了,或者说识别精度很低。 很明显,模型的泛化能力太差,难道戴着头盔的猫咪就不是猫…

坚鹏:贵州银行西南财经大学零售业务数字化转型与场景营销策略

中国银保监会2022年1月正式发布了中国银保监会发布《关于银行业保险业数字化转型的指导意见》,这标准着中国银行业从局部的数字化转型向全面的数字化转型转变,进一步加速了银行数字化转型高潮的到来。 《关于银行业保险业数字化转型的指导意见》提出明确…

一次脚本测试的内存增长问题

问题背景 问题描述:进入应用的视频素材剪辑页面然后退出,脚本循环执行500次,内存增长156M 问题分析 分析增长曲线图 曲线反映了从0到500次脚本执行过程中adb shell dumpsys meminfo抓取内存的增长情况,可以看出是Native内存一直…

JavaScript解构对象

之前介绍了数组解构,本文来介绍一下对象如何解构; 前言 现在我们有这样的一个数组: const restaurant {name: Classico Italiano,location: Via Angelo Tavanti 23, Firenze, Italy,categories: [Italian, Pizzeria, Vegetarian, Organic…

LINUX入门篇【10】---进程篇【2】---进程状态

前言: 有了上一篇关于进程的初步认识和我们的PCB第一个数据段–标识符的讲解,接下来我们将继续讲解PCB的其他数据段,本篇要讲的是进程状态。 进程状态: 就像我们写贪吃蛇的时候,构建的游戏状态来判定游戏结束的方式…

1-1、汇编语言概述

语雀原文链接 文章目录 1、机器语言2、汇编语言(Assembly Language)汇编语言工作过程汇编语言三类指令 3、学习资料电子PDF课件论坛视频教程 1、机器语言 机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器…

【uniapp】微信运行报错TypeError_ Cannot read property ‘FormData‘ of undefined

文章目录 一、报错详情:二、解决: 一、报错详情: 二、解决: npm install axios0.27.2 #或者 npm install axios1.3.4

SpringBoot——国际化

优质博文:IT-BLOG-CN 一、Spring 编写国际化时的步骤 【1】编写国际化配置文件; 【2】使用ResourceBundleMessageSource管理国际化资源文件; 【3】在页面使用ftp:message取出国际化内容; 二、SpringBoot编写国际化步骤 【1】创…

【算法优选】 动态规划之路径问题——壹

文章目录 🎋前言🎋[不同路径](https://leetcode.cn/problems/unique-paths/)🚩题目描述:🚩算法思路:🚩代码实现 🎋[不同路径二](https://leetcode.cn/problems/unique-paths-ii/desc…

金蝶Apusic应用服务器 任意文件上传漏洞复现

0x01 产品简介 金蝶Apusic应用服务器(Apusic Application Server,AAS)是一款标准、安全、高效、集成并具丰富功能的企业级应用服务器软件,全面支持JakartaEE8/9的技术规范,提供满足该规范的Web容器、EJB容器以及WebSer…

使用echars实现数据可视化

生活随笔 展翅飞翔之际 请下定决心不再回头 echars实现数据可视化 在搭建后台页面时,可能会遇到很多的表格,但有时表格所展现的数据并不能直观的体现出当前用户的宏观信息,所以就可以引入一个新的表格插件——echars 快速上手 - Handbook…

客户关系管理系统功能清单

客户关系管理系统功能清单 一、客户信息管理 1. 客户基本信息:包括客户名称、地址、电话、电子邮件等。 2. 客户关系信息:包括客户的购买历史、服务记录、支持案例等。 3. 客户分类信息:根据客户的重要程度、购买行为、偏好等因素&#xff…

01-鸿蒙4.0学习之开发环境搭建 HelloWorld

HarmonyOS开发学习 1.环境配置 1.下载地址 开发工具:DevEco Studio 3.1.1 Release 下载地址 安装选择快捷方式 安装nodejs和Ohpm 安装SDK 选择同意Accept 检测8项目是否安装成功 2.创建项目 —— hello word

美国高防云服务器的优劣势分析(相比普通云服务器)

在当前数字化时代,云服务器已经成为企业和个人进行在线业务的重要基础设施。而在选择云服务器时,很多人会面临一个问题:是选择普通云服务器还是高防云服务器?本文将从多个方面来分析美国高防云服务器相比普通云服务器的优势和劣势。 我们来看…

ELK分布式日志管理平台部署

目录 一、ELK概述 1、ELK概念: 2、其他数据收集工具: 3、ELK工作流程图: 4、ELK 的工作原理: 5、日志系统的特征: 二、实验部署: 1、ELK Elasticsearch 集群部署 2、安装 Elasticsearch-head 插件 …

手把手教你如何设置同花顺的分时量颜色

文章目录 💢 问题 💢💯 设置方法 💯🐾 操作步骤💢 问题 💢 同花顺软件的分时图中,分时成交量的颜色不是我们常见的红绿色,我们可以通过设置将分时颜色设置为上涨量为红,下跌量为率,以便观察,如图 💯 设置方法 💯 本教程是在同花顺v9.20.50版本中进行演…

linux task_struct中进程调度相关的变量记录

参考文章: Linux进程调度分析记录,进程优先级,隔离处理器,isolcpus - 知乎

中兴交换机:DHCP的配置

一、配置说明 拓扑图 S1是中兴三层核心交换机,作为DHCP Server使用,同时作为网关,PC通过自动获取IP地址接入网络 注意事项: S1全局下需要配置:IP Pool,DHCP Policy,打开DHCP功能 S1接口下需…

C# WPF上位机开发(第一个应用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 万事开头难,很多事情都是难在第一步。走出了这第一步,回过头看以前走的每一步,发现其实也不难。用c# wpf编写界…

基于单片机仿指针显示的电子时钟设计

**单片机设计介绍, 基于51单片机超声波测距汽车避障系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机仿指针显示的电子时钟是一种利用单片机控制器和LED或LCD显示屏幕来模拟传统时钟指针的显示效果的设计…