MySQL CRUD进阶

  前言👀~

上一章我们介绍了CRUD的一些基础操作,关于如何在表里进行增加记录、查询记录、修改记录以及删除记录的一些基础操作,今天我们学习CRUD(增删改查)进阶操作

如果各位对文章的内容感兴趣的话,请点点小赞,关注一手不迷路,如果内容有什么问题的话,欢迎各位评论纠正 🤞🤞🤞

12b46cd836b7495695ce3560ea45749c.jpeg

个人主页:N_0050-CSDN博客

相关专栏:java SE_N_0050的博客-CSDN博客 java数据结构_N_0050的博客-CSDN博客


数据库约束

含义:数据库,自动的对数据的合法性进行 校验检查 的一系列机制,目的就是为了保证数据

库中能够 避免 被插入/修改 一些非法的数据

7a95205de3ea4afd98365e4d37327683.png


not null

这一列不能填null值(相当于必填项),并且插入和修改都会被限制

create table 表名(列名 类型 not null,列名 类型....);

创建

6a7d0cbcd93d43c1beb4e509b056913a.png

插入

当我们进行插入发现会报错,因为我们设置了id这一列不能为空

2e6fcc9761c24b5b972695fc2ed269fd.png

修改

当我们进行修改的时候也会报错,也是因为我们设置了id这一列不能为空

8d4e8113349044138322ff2c25483f52.png


unique

相当于填写的值不能重复,并且插入和修改都会被限制,且会让后续的 插入和修改数据 的时候,都会先触发一次 查询 的操作(通过这个查询,来确定当前这个记录是否已经存在)

create table 表名(列名 类型 unique,列名 类型...);

创建

88599c26dbeb4c9199cb7990ca246612.png

插入

我们先插入一条数据,然后再插入一条数据但是id跟上一次插入的id一样,发现报错了,结合上面说的后续的插入和修改数据的时候,都会先触发一次 查询的操作,通过这个查询,来确定当前这个记录是否已经存在

8ef0fc2e88214cd898e6b7b3f1e9e25e.png


default

没有给列赋值时,就按默认值进行插入

create table 表名(列名 类型 default '你想默认值显示什么就填什么' ,列名 类型...);

一般没赋值的话,默认都是null

1c2b1d3216ba4dc489f1d21b3ca0cc7f.png

创建

007342cb2f7d484cb44b25b96cab9f90.png

查看表结构

查看表结构的时候,我们会发现name这列default默认值是未命名

611e3b0c92e04ee6b09d39cc4d2668d2.png

查询

当我们只对id列插入数据,去查询发现我们的name这列这行的默认值是我们刚才设置的

b3317377ff6a478bb20e598cfe8840dc.png


primary key(主键,最重要的约束)

确保列有唯一标识,例如我们的身份证,在填写的时候不能为空且不能重复相当于是 not null unique 的结合

create table 表名(列名 类型 primary key,列名 类型);

创建

a24d0a6607c145628090e4c4064fae52.png

查看表结构

3445a157c0b543a38920cb8aac8e0111.png

插入

我们先插入一条数据,第二次插入同样的id会报错,原因是id设置为主键了,值不能重复

e4bd3798ae1a4263999781ed24fcaeb5.png


如何保证主键唯一呢?

mysql提供了一种“自增主键”这样的机制

create table 表名(列名 类型 primary key auto_increment,列名 类型);

创建

9f4009b3f6584e6b8b7dad808d7e3889.png

查看表结构

f3a653d1d3274342ba29589509f3db67.png

插入

我们在插入数据的时候id列设为空,查询的时候会发现它会进行自增

2157b4b18cf3484e85bb51efd6380ca0.png

插入的时候从 刚才的最大值 开始,继续往后分配的

7fee355d84e14a84a33d08ac68eb47fd.png

补充:

这里的id的自动分配,有一定的局限性,如果是单个mysql服务器,没什么问题

如果是一个分布式系统,有多个mysql服务器构成的集群,这个时候依靠 自增主键 就不行了

分布式系统:面临的数据量大(大数据),客户端的请求量(高并发)比较大,一台
服务器搞不定就需要多台机器(分布式)

注意:

一张表里只能有 一个primary key(主键)

虽然只能有一个 主键,但是主键不一定只是一个列,也可以用多个列共同构造一个主键(联合主键)

主键经常会使用 int / bigint

对于带有主键的表来说,每次 插入和修改数据,也会涉及到先触发查询的操作

mysql会把带有 unique 和 primary key 的列自动生成 索引(后续会讲到),从而加快查询速度


foreign key(外键)

保证一个表中的数据匹配另一个表中的值的参照完整性

一个表可以有多个外键,但是只能有一个主键!!!

create table 表名(列名 类型 ,foreign key 列名,列名 类型...,references 另一张表名(列名));

没有设置外键的演示

22cff949ff394e4bb79f8925b1a2030f.png

我们会发现没有设置外键的话,我们在person表里可以插入这条数据,即使在class表里没有存在classid为100的数据


接下来是设置外键的演示

references 此处表示了当前这个表的这一列中的数据,应该出自于另一个表的哪一列

创建

89c26a8789334ea3944e912e31a81e63.png

插入和修改

当我们指定了外键的时候,在插入数据和修改数据的时候都会去做出校验,可以理解为父表约束子表

521cf56eefd343509d8fbf11cb5c3fdc.png

897144e9430142ccbeaf8aaf6e71c4d9.png


  • 对父表进行删除或修改操作

9594a431ce094a56833fb7fcb9b28fdb.png

1df37a0be5be499dafab84b3dd20686e.png

结合上面的操作我们可以理解为两个进行捆绑了的意思一样,比如我们都有的数据不能进行乱动,比如插入、修改、删除等操作,你有我没有的这没什么关系


  • 外键准确来说,是两个表的 列产生关联联系,其他的列是不受影响的!!!

25c51da48896440d83bd93d49be99f48.png

即使用到了,但是不相同的列不受影响

c15bca795c0b412aae59fe4ac40f4424.png


  • 删除父表时,必须先删除子表,否则父表无法删除!!!

错误演示

05d37a8d83b246df8a00134f33242522.png

正常演示

d11192610aae4c82926c1658431f42ae.png


  • 指定外键约束时,要求父表中被关联的这一列,得是 主键 或者 unique(外键用于关联其他表的主键或唯一键)
     

566ab28188d54c7aab50c2818c0d4d1f.png


表的设计

根据实例的需求场景,明确当前要创建几个表,每个表什么样子,这些表之间是否存在一定联系

1.梳理清楚 需求中的“实体”(就是说过的“对象”=>需求中的关键性名词)

一般来说,每个实体,都需要安排一个表,表的列就对应到实体的各个属性

2.再确定好 “实体”之间的关系


一对一:

5840144bab1741da9478ee3da701dfc5.png


一对多:

72d4520f1e2841f78a73d856679ef162.png


多对多:

af40846be82345eba802924250000eac.png


查询操作的进阶

查询可以搭配 插入 使用(把查询语句的查询结果,作为插入的数值

简单点说就是把你在 另外一张表查询出来的结果,插入到你 指定的表 中

insert into 表1 select * from 表2;

先准备两张表

89f70ce6bd3c4040a9fb7bbd7e5e0042.png

接着我们插入

526080c7cf484e00a5ce1f96209c451d.png

注意:

此处,要求查询出来的结果集合列数和类型 要和插入的这个表匹配


聚合查询

聚合查询,相当于是在 行 和 行 之间进行运算

sql中提供了一些“聚合函数”通过聚合函数来完成上述行之间的运算

530aa95fae334c0997794d1a1a71ed63.png
以下这些“聚合函数”要求务必对数字类型进行操作,如果对字符串类型进行操作,会强转成double执行后续的操作

count

select count(列名) from 表名;

用法

ab56c12cb3ea431e924f5b4a8c30f944.png

指定列

这里即使我插入一条数据,还是 name这一列 还是只统计了7条,因为有null值会被排除掉

776d8ac85e3f4410ac3942f80fe0be1c.png

搭配去重使用

6558168e4845463e832c2f9de9acd4a1.png


注意格式:

e11a386e2dcc43a79979ed6d382f0111.png


sum

把这一列的 若干行,进行求和(算术运算,只针对数字类型使用)

select sum(列名,列名...) from 表名;

用法

同样有null值会被排除掉

37e3bab6a8d84c9d84e97fe265cd837b.png


对表达式进行相加

c8a04c0808414f42bc5a91bc72d20861.png


avg:求平均值


max:求最大值


min:求最小值


group by(分组查询)

使用 group by 进行分组(针对指定的列进行分组,把这一列中,值相同的行,分到同一组中,得到若干个组),针对每个分组,再分别进行聚合查询

select 列名,列名... from 表名 group by 列名,列名;

演示

查询每个role对应的平均薪资

根据role这一列进行分组,针对分出来的每一个组再使用avg函数

如果针对分组之后,不使用聚合函数,此时的结果就是查询出每一组的某个代表数据

使用group by的时候,还可以搭配条件

比如我们查询每个岗位的平均工资,排除老三


having

group by子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用having

select 列名,列名... from 表名 group by 列名,列名 having 条件;

使用having描述条件,having一般写在group by的后面

这里我们演示搭配where和having进行查询


联合查询/多表查询

对比之前的查询,则是一次性对多个表中进行查询

多表查询是对多张表的数据取笛卡尔积

笛卡尔积 工作过程:

1.笛卡尔积的列数,是这两个表的列数相加

2.笛卡尔积的行数,是这两个表的行数相乘

笛卡尔积就是多表查询的基础,多表查询在笛卡尔积的基础上再去进行数据的筛选!

内连接

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

查看表结构

我们去查询 许仙同学的成绩

1.先进行笛卡尔积(数据太多,就展示这些后面慢慢筛选掉)

2.下一步加上连接条件,这里刚好是没有重复的列,如果这个id也叫student_id就会出现重复的列,会有问题,所以要这样写 表名.列名 类似java对象访问成员

3.添加条件进行筛选

4.对列进行精简


我们去查询所有同学的总成绩,及同学的个人信息

同样我们进行笛卡尔积,然后加上连接条件 

然后进行分组,不加 group by

加group by

我们会发现不加group by都算到一个人头上了,加了group by就是每个同学对应的总成绩


查询每个同学,每门课程课程名字和分数

同样要先笛卡尔积,并且加上连接条件,这里涉及到三张表,需要两个连接条件

然后选择要显示的列


外连接

外连接分为 左外连接右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。

首先我们先创建两张表然后进行连接

左外连接:

以左侧表为基准,保证左侧表的每个数据都会出现在最终结果里,如果在右侧表中不存在,对应的列就填成null

-- 左外连接,表 1 完全显示
select 字段名   from 表名 1 left join 表名 2 on 连接条件 ;

右外连接:

以右侧表为基准,保证右侧表的每个数据都会出现在最终结果里,如果在左侧表中不存在,对应的列就填成null

-- 右外连接,表 2 完全显示
select 字段 from 表名 1 right join 表名 2 on 连接条件 ;

全外连接:


自连接

自连接是指在同一张表连接自身进行查询

select * from  表 a1, 表 a2 where a1.id=a2.id;

显示所有“计算机原理”成绩比“Java”成绩高的成绩信息

就是同一张表,自己对自己先进行笛卡尔积,并且注意要为这两个表 命一个别名,as可加可不加

接着加上连接条件,以及我们要求的条件

最后挑选出要显示的列

我们进行优化显示学生的所有信息以及课程名


子查询

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

select 列名 from 表名 where 列名 =、>、<、in等 (select 列名 from 表名 where 条件);

单行子查询:返回一行记录的子查询

例题:查询与“不想毕业” 同学的同班同学

1.先在student表找出不想毕业同学在哪个班

2.接着在student表找出不想毕业的同班同学

3.接下来就是子查询的关键了,我们把id=1换成我们第一次查询的结果


多行子查询:返回多行记录的子查询

例题:查询“语文”或“英文”课程的成绩信息

1.同样第一步我们在course表找出 语文或英文 的id

2.接着联表查询出语文或英文的成绩信息

3.同样我们把 in 后面的条件替换成一开始查询的结果


合并查询

把多个sql查询的结果集合,合并到一起

select 列名 from 表名 union select 列名 from 表名;

例题:查询id小于3,或者名字为“英文”的课程

一般我们的做法是如下

但是 or 只能针对一个表,使用 union 允许两个不同的表,查询结果合并到一起,但是合并的sql的结果集的 要匹配,列的个数和类型要一致

union all

当我们使用 union 的时候发现,它会去重

我们去使用 union all,发现会取消去重

到这就结束了增删改查的进阶操作,知识点还是非常之多,一下子可能消化不了,需要慢慢细品,希望各位能看得懂并且理解进去,我们下一章再见💕

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

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

相关文章

【网络编程下】五种网络IO模型

目录 前言 一.I/O基本概念 1.同步和异步 2.阻塞和非阻塞 二.五种网络I/O模型 1.阻塞I/O模型 2.非阻塞式I/O模型 ​编辑 3.多路复用 4.信号驱动式I/O模型 5. 异步I/O模型 三.五种I/O模型比较​编辑 六.I/O代码示例 1. 阻塞IO 2.非阻塞I/O 3.多路复用 (1)select …

Electron 对 SQLite 进行加密

上一篇讲了如何在 Electron使用 SQLite&#xff0c;如果 SQLite 中存有敏感数据&#xff0c;客户端采用明文存储风险很高&#xff0c;为了保护客户数据&#xff0c;就需要对数据进行加密&#xff0c;由于 electron 对代码并不加密&#xff0c;所以这里排除通过逆向工程进行数据…

想要快速接收的看过来:Cell旗下毕业神刊,中科院二区、平均审稿周期1个月,冲!

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 就是它了&#xff0c;Cell旗下全OA期刊iScience。影响因子5.8分&#xff0c;中科院二区&#xff0c;年发文量逐年上涨&#xff0c;2023年发文近3000篇&#xff0c;2024年第一季…

一周学会Django5 Python Web开发 - Django5 ModelForm表单定义与使用

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计51条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

一种算法分类方式及其应用

在计算机科学领域&#xff0c;算法是解决问题的有效方法&#xff0c;而对算法进行分类有助于理解它们的特性、优劣以及在不同场景下的应用。常见的算法分类方法&#xff0c;包括按设计思想、问题类型、数据结构和应用领域等&#xff0c;每一类算法会对应有其典型和实际应用。 算…

spring boot3多模块项目工程搭建-上(团队开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 多模块结构优缺点 模块介绍 Common 模块&#xff1a; API 模块&#xff1a; Web 模块&#xff1a; Service 模块&#xff1a; DAO 模块&#xff1a; 搭建步骤 1.创建 父…

深入理解分布式事务⑨ ---->MySQL 事务的实现原理 之 MySQL 中的XA 事务(基本原理、流程分析、事务语法、简单例子演示)详解

目录 MySQL 事务的实现原理 之 MySQL 中的XA 事务&#xff08;基本原理、流程分析、事务语法、简单例子演示&#xff09;详解MySQL 中的 XA 事务1、XA 事务的基本原理1-1&#xff1a;XA 事务模型图&#xff1a;1-2&#xff1a;XA 事务模型的两阶段提交操作&#xff1a;Prepare …

Stable Diffusion webUI 最全且简单配置指南

Stable Diffusion webUI 配置指南 本博客主要介绍部署Stable Diffusion到本地&#xff0c;生成想要的风格图片。 文章目录 Stable Diffusion webUI 配置指南1、配置环境&#xff08;1&#xff09;pip环境[可选]&#xff08;2&#xff09;conda环境[可选] 2、配置Stable Diffu…

Jenkins docker部署springboot项目

1、创建jenkins容器 1&#xff0c;首先&#xff0c;我们需要创建一个 Jenkins 数据卷&#xff0c;用于存储 Jenkins 的配置信息。可以通过以下命令创建一个数据卷&#xff1a; docker volume create jenkins_data启动 Jenkins 容器并挂载数据卷&#xff1a; docker run -dit…

Leetcode—422. 有效的单词方块【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—422. 有效的单词方块 实现代码 class Solution { public:bool validWordSquare(vector<string>& words) {int row words.size();for(int i 0; i < row; i) {// 当前这一行的列数int col words[i].length(…

Java高阶私房菜:JVM性能优化案例及讲解

目录 核心思想 优化思考方向 压测环境准备 堆大小配置调优 调优前 调优后 分析结论 垃圾收集器配置调优 调优前 调优后 分析结论 JVM性能优化是一项复杂且耗时的工作&#xff0c;该环节没办法一蹴而就&#xff0c;它需要耐心雕琢&#xff0c;逐步优化至理想状态。“…

驾校考试宝典vip一点通驾考精简500题科目一四速记口诀c1答题技巧

下载地址&#xff1a;驾校考试宝典vip一点通驾考精简500题科目一四速记口诀c1答题技巧.zip 这份速记口诀考点总结 评分标准 和答题技巧&#xff0c;很详细&#xff0c;全科目速记口诀秘笈.pdf

QT中的容器

Qt中的容器 关于Qt中的容器类&#xff0c;下面我们来进行一个总结&#xff1a; Qt的容器类比标准模板库&#xff08;STL&#xff09;中的容器类更轻巧、安全和易于使用。这些容器类是隐式共享和可重入的&#xff0c;而且他们进行了速度和存储的优化&#xff0c;因此可以减少可…

mysql 指定根目录 迁移根目录

mysql 指定根目录 迁移根目录 1、问题描述2、问题分析3、解决方法3.1、初始化mysql前就手动指定mysql根目录为一个大的分区(支持动态扩容)&#xff0c;事前就根本上解决mysql根目录空间不够问题3.1.0、方法思路3.1.1、卸载mariadb3.1.2、下载Mysql安装包3.1.3、安装Mysql 8.353…

TouchGFX 总结

文章目录 使用中文字体多屏幕间交换数据UI to MCUMCU to UI API文档参考横竖屏切换 使用中文字体 添加一个textArea&#xff0c;默认的英文文本可见&#xff0c;输入中文字体后就看不见了&#xff0c;是因为这个默认的字体不支持中文&#xff0c;改一下字体就可以了&#xff1…

全方位解析Node.js:从模块系统、文件操作、事件循环、异步编程、性能优化、网络编程等高级开发到后端服务架构最佳实践以及Serverless服务部署指南

Node.js是一种基于Chrome V8引擎的JavaScript运行环境&#xff0c;专为构建高性能、可扩展的网络应用而设计。其重要性在于革新了后端开发&#xff0c;通过非阻塞I/O和事件驱动模型&#xff0c;实现了轻量级、高并发处理能力。Node.js的模块化体系和活跃的npm生态极大加速了开发…

网络基础-网络设备介绍

本系列文章主要介绍思科、华为、华三三大厂商的网络设备 网络设备 网络设备是指用于构建和管理计算机网络的各种硬件设备和设备组件。以下是常见的网络设备类型&#xff1a; 路由器&#xff08;Router&#xff09;&#xff1a;用于连接不同网络并在它们之间转发数据包的设备…

深入理解网络原理2----UDP协议

文章目录 前言一、UDP协议协议段格式&#xff08;简图&#xff09;校验和 二、UDP与TCP 前言 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同⼯作来完成业务&#xff0c;就有了⽹络互连。 一、UDP协议 协…

java发送请求-http和https

http和https区别 1、http是网络传输超文本协议&#xff0c;client---- http------ server 2、httpshttpssl证书&#xff0c;让网络传输更安全 &#xff0c;client---- httpssl------ server 3、ssl证书是需要客户端认可的&#xff0c;注意官方证书和jdk生成的证书的用户来使…

【Github】将github仓库作为图床使用

创建github仓库 首先创建一个github仓库专门用于存储图片&#xff0c;具体步骤如下&#xff1a; 1.点击新的仓库按钮 2.初始配置&#xff1a;随便填写一个仓库名&#xff1b;这里的仓库状态一定要是public公开的&#xff0c;不然后面访问不了图片 下载PicGo PicGo官网 在A…