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

【从删库到跑路 | 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:
在这里插入图片描述

相关文章:

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

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

[每周一更]-(第74期):Docker-compose 部署Jenkins容器-英文版及错误纠错

1、前文概要 通过物理机部署Jenkins前文已经讲过(地址:[Jenkins] 物理机 安装 Jenkins),也已经公司内部平稳运行若干年,考虑到容器化的使用场景,部分项目都采用容器运行,开始考虑部署容器化的J…...

MySQL日期函数sysdate()与now()的区别,获取当前时间,日期相关函数

select sleep(2) as datetime union all select sysdate() -- sysdate() 返回的时间是当前的系统时间,而 now() 返回的是当前的会话时间。 union all select now() -- 等价于 localtime,localtime(),localtimestamp,localtimestamp(),current_timestamp,curre…...

邦芒解析:面试怎么谈自身优缺点

在面试时,当被问到你的优缺点时,你可以这样回答: 优点: 我的工作能力强,能够高效地完成任务。我对技术有热情,喜欢学习新的技能和知识。我善于沟通,能够与不同背景的人进行有效沟通。我注重细节…...

【libGDX】加载G3DJ模型

1 前言 libGDX 提供了自己的 3D 格式模型文件,称为 G3D,包含 g3dj(Json 格式)和 g3db(Binary 格式)文件,官方介绍见 → importing-blender-models-in-libgdx。 对于 fbx 文件,libGDX…...

0基础学习VR全景平台篇第123篇:VR视频航拍补天 - PR软件教程

上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 嗨,大家好,今天我们来介绍【航拍VR视频补天】。之前已经教给了大家如何处理航拍图片的补天,肯定有很多小伙伴也在好奇,航拍的VR视频…...

webpack打包三方库直接在html里面使用

场景:我是小程序中使用wxmp-rsa库进行加密,然后在html里面解密 我就想把wxmp-rsa库打包到一个js里面,然后在html里面直接引入使用。 webpack配置 const path require("path"); const MiniCssExtractPlugin require("mini-…...

Redis使用increment方法返回null的原因以及解决方案

public static void main(String[] args) {redisTemplate.setEnableTransactionSupport(true); //开启事务支持redisTemplate.multi(); //标记事务块的开始redisTemplate.opsForValue().set("name","zs");redisTemplate.opsForValue().set("pass&qu…...

springMVC,什么是Spring MVC? Spring MVC的主要组件? springMVC工作原理/流程 MVC框架

文章目录 springMVC什么是Spring MVC?Spring MVC的主要组件?springMVC工作原理/流程MVC框架 今天以这篇文章简单和大家聊聊springMVC相关的内容,和原理,以及框架; springMVC 什么是Spring MVC? Spring MV…...

【论文阅读】TACAN:控制器局域网中通过隐蔽通道的发送器认证

文章目录 摘要一、引言二、相关工作三、系统和对手模型3.1 系统模型对手模型 四、TACAN4.1 TACAN 架构4.2 发送方认证协议4.3 基于IAT的隐蔽通道4.4 基于偏移的隐蔽通道(本节公式格式暂未整理)4.5 基于LSB的隐蔽通道 摘要 如今,汽车系统与现…...

C语言第三十五弹---打印九九乘法表

C语言打印九九乘法表 思路&#xff1a;观察每一行可以看出乘号右边的一行值都是相同的&#xff0c;而乘号左边不断变化&#xff0c;所以使用嵌套循环&#xff0c;控制好 乘号左右值变化的条件即可。 #include <stdio.h>int main() {for (int i 1; i < 9; i){for (in…...

线性代数的艺术

推荐一本日本网友Kenji Hiranabe写的《线性代数的艺术》。这本书是基于MIT大牛Gilbert Strang教授的《每个人的线性代数》制作的。 虽然《线性代数的艺术》这本书仅仅只有12页的内容&#xff0c;就把线性代数的重点全画完了&#xff0c;清晰明了。 《线性代数的艺术》PDF版本&…...

基于注解配置的AOP

注解方式AOP基本使用 Spring的AOP也提供了注解方式配置&#xff0c;使用相应的注解代替之前的xml配置。 xml配置&#xff1a; <aop:config> <!-- 配置切入点 目的是指定哪些方法增强--><aop:pointcut id"myPointCut1" expression"execu…...

【Qt】QStackedWidget、QRadioButton、QPushButton及布局实现程序首页自动展示功能

效果 在程序启动后&#xff0c;有时不会进入到工作页面&#xff0c;会进入到产品展示页面。 动画如下&#xff1a; 首页展示 页面操作 当不点击时&#xff0c;一秒自动刷新一次&#xff1b;当点击时&#xff0c;会自动跳转到对应页面&#xff1b;点击上一页、下一页、及跳转页…...

探索 V8 引擎的内部:深入理解 JavaScript 执行的本质

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

单片机学习11——矩阵键盘

矩阵键盘&#xff1a; 这个矩阵键盘可以接到P0、P1、P2、P3都是可以的。 使用矩阵键盘是能节省单片机的IO口。 P3.0 P3.1 P3.2 P3.3 称之为行号。 P3.4 P3.5 P3.6 P3.7 称之为列号。 矩阵键盘检测原理&#xff1a; 1、检查是否有键按下&#xff1b; 2、键的抖动处理&#xf…...

Java游戏 王者荣耀

GameFrame类 所需图片&#xff1a; package 王者荣耀;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList…...

接口测试场景:怎么实现登录之后,需要进行昵称修改?

在接口测试中有一个这样的场景&#xff1a;登录之后&#xff0c;需要进行昵称修改&#xff0c;怎么实现&#xff1f; 首先我们分别看下登录、昵称修改的接口说明&#xff1a; 以上业务中补充一点&#xff0c;昵称修改&#xff0c;还需要添加请求头Authorization传登录获取的to…...

石油化工专业MR仿真情景教学演练

首先&#xff0c;MR混合现实情景实训教学系统为学生提供了一个高度仿真的学习环境。在这个环境中&#xff0c;学生可以亲自操作设备&#xff0c;进行模拟实验&#xff0c;甚至可以体验到工业事故的模拟情景&#xff0c;从而更好地理解工艺流程的复杂性和安全性。这种沉浸式的学…...

Docker配置Halo搭建个人博客-快速入门

Docker配置Halo搭建个人博客-快速入门 1 官方文档2 安装Halo2.1 创建Halo主目录2.2 远程下载配置文件2.3 编辑配置文件2.4 拉取最新镜像2.6 查看容器2.7 开放服务器的防火墙 3 运行3.1 运行项目3.2 停止项目 4 常见问题4.1 没有权限4.2 ommand netstart not found, did you mea…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...