MySQL增删查改(进阶)

news2024/11/22 9:03:47

目录

数据库约束

表的设计 

查询操作的进阶

查询搭配插入使用

聚合查询

1>count(*)

2>sum(*)

3>avg(*)

4>max(*)

5>min(*)

group by分组分别进行聚合查询

联合查询 / 多表查询[重点]

外连接

自连接

子查询

合并查询

小结: 


数据库约束

有时候对数据库的数据有一定要求, 相对于计算机来说, 人不靠谱, 数据库自动对数据的合法性进行校验检查的一系列机制, 目的是为了保证数据库中避免被插入/修改一些非法数据

MySQL中提供了一下约束:

NOT NULL : 指定某列不能存储NULL值

UNIQUE: 保证某列的每行必须有唯一的值

DEFAULT: 规定没有给列赋值时的默认值

PRIMARY KEY: NOT NULL 和 UNIQUE 的结合, 唯一标识

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

CHECK: 保证列中的值符合指定的条件(了解)

举个例子:创建一个数据库, 和一个学生表

NOT NULL : 指定某列不能存储NULL值

这时可以加入null这个数据

现在删除这个表加入约束条件 NOT NULL, 重新进行上述操作

添加失败, 不但插入不能加入NULL数据, 修改也不行.

显示修改失败.

UNIQUE: 保证某列的每行必须有唯一的值

如图:重新创建一个学生表

然后里面可以有重复的数据, 现在创建一个加入约束条件的表,  重复上述操作.

这时一个数据只能进行一次插入, 同样" 修改 " 操作也会限制. 

unique 约束, 会让后续插入/ 修改数据的时候都会触发一次查询操作, 通过这个查询来确定这个记录是否已经存在, 数据引入约束后, 执行效率就会受到影响, 可能降低很多. 这就意味着数据库是比较慢的系统, 成为一整个系统的" 性能瓶颈 ".

DEFAULT: 规定没有给列赋值时的默认值

在第五列, 默认的默认值的值时null通过default约束修改默认值

这是修改过后的值.

后续插入数据的时候, default 就会在没有显式指定插入的值时生效了.如图:

上述设置约束都是先删除表再重新创建表, 也能不删除表直接设置约束, 但比较麻烦.

一个数据可以有多个约束

PRIMARY KEY: NOT NULL 和 UNIQUE 的结合, 唯一标识(最重要的约束)

一张表里面只能有一个 primary key , 一张表里的纪录只能有一个作为身份标识的数据, 否则会报错.

虽然只能有一个主键, 但是主键不一定只是一个列, 也可以用多个列构成主键, (联合主键), 这个了解即可.

对于带有主键的表来说, 每次插入数据 / 修改数据, 也会涉及到进行先查询的操作.mysql 会把带有unique和primary key的列自动生成索引, 从而加快查询速度.

如何保证主键唯一呢?

mysql提供了 " 自增主键 "的机制

主键经常使用int / bigint 作为主键

插入数据时数据库服务器分配一个主键, 从1开始, 自己也可以指定

这时插入一个记录, 自动从一开始.我们指定一个10id插入后, 再次输入空值后, 选择最大的数值开始继续往后分配.

此处id的自动分配有局限性, 如果是单个MySQL服务器没问题, 如果时分布式系统(就是多台机器),多个MySQL服务器构成的集群, 依靠自主增键就不行了, 分布式系统中生成唯一 id 的算法有很多, 公式: id = 时间戳 + 机房编号/主机编号 + 随机因子

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

创建班级表, id和name, 其中id为主键, 创建学生表, id, name和 classId, 一个学生对应一个班级, 一个班级对应多个学生,  id为主键, classId为外键 其中class表称为父表. student表 称为子表

其中froeign key(classId) 中的classId为当前表中的, 后面的值class表中的

针对这个插入操作, 会触发对class表的查询, 看插入的数据在class中是否存在,修改操作同样如此

注意:

1>对父表进行修改/删除操作, 如果当前被修改/删除的值, 已经被子表引用了, 这样的操作也会失败, 外键约束要始终保持

2>如果想要删除父表, 需要先删除子表

3>指定外键约束的时候, 要求父表被关联的这一列得是主键或者 unique

表的设计 

两个要点:

1> 梳理清楚需求中的" 实体 "  

2> 确定好实体之间的关系

实体就是对象, 每个实体一个表, 表的列对应实体的属性

实体之间的关系三种, 一对一, 一对多, 多对多

1> 一对一 : 一个学生拥有一个账号, 一个账号只能被一个学生拥有

2> 一对多: 一个班级拥有多个学生, 一个学生只能拥有一个班级

3> 多对多: 一个学生拥有多个课程, 一个课程拥有多个学生

查询操作的进阶

查询搭配插入使用

把一个查询语句的查询结果插入

如图: 创建s1和s2然后把s的值放入s2中,刚开始为空

插入之后:

注意: 要求查询出来的结果集合, 列数/类型要和插入的表匹配;

聚合查询

表达式查询是针对 列 和 列 之间进行运算的

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

MySQL提供一些聚合函数进行运算

举个例子: 先创建一个表, 如图:

1>count(*)

获取行数, 先执行select *在针对结果几个进行统计

注意:

1) 如果当前列里面有null就不同了

2) 指定具体列可以去重

如图:

name那一列有null显示查出了7行

数学那一列有两个98, 使用 distinct 指定这一列时会去重

2>sum(*)

把这一列算数相加

sum(列)

sum(表达式)

3>avg(*)

4>max(*)

5>min(*)

group by分组分别进行聚合查询

针对指定的列进行分组, 把这一列中, 值相同的行, 分到一组中, 得到若干个组, 针对这些组分别使用聚合函数.

举个例子:如图

如果针对所有人算薪资的平均值是不准的, 应该让每个职位的人分组后在计算

往往进行分组要和聚合函数搭配使用. 

注意:

使用group by的时候, 还可以搭配条件, 需要区分清楚, 该条件是分组之前的条件还是分组之后的条件

例子:

1> 查询每个岗位的平均工资, 但是排除张三  (分组条件值之前)

直接使用where即可, where 字句写在group by之前

2> 查询每个岗位的平均薪资, 但是排除平均薪资超过2W的结果 (分组条件之后)

使用 having 描述条件, having 字句写在group by后面

3> 在group by , 可以一个sql同时完成这两类条件的筛选

查询每个岗位的平均薪资, 不算张三, 并且保留 平均值 < 2W的结果

联合查询 / 多表查询[重点]

前面的查询针对一个表, 有些查询需要从多个表中进行查询

关键思路在于" 笛卡尔积 "工作过程

举例:

第一组: A  B  C

第二组: 1  2  3

计算笛卡尔积就是他们的排列组合: A1, A2, A3, B1, B2, B3, C1, C2, C3

笛卡尔积通过排列组合得到更大的表, 笛卡尔积的列数就是两个表的列数相加, 笛卡尔积的行数就是两个表的行数相乘.(其中有的数据是无意义的, 需要通过一个条件(连接条件)把有意义的数据筛选出来)

举个例子:如图,共4张表, 学生, 班级, 课程, 分数(学生和课程之间的关联表)

1> 查询许仙的成绩

先进行笛卡尔积(对学生和分数)

然后筛选学生表的ID和分数表的同学ID相同的行数

选择不同表中的列尽量加上两个表的名称.列名


然后筛选出许仙同学的行

最后针对所需要的信息进行精简

2>查询所有同学的总成绩, 以及同学的个人信息(多表查询和聚合查询综合运用)

先进行笛卡尔积

然后指定连接条件

先精简列

针对上述结果, 再进行 group by 聚合查询

3>列出每个同学, 每门课程课程名字和分数

先进行笛卡尔积

然后指定连接条件

然后精简列

可以使用别名如下图:

外连接

上述操作时" 内连接 ", MySQL进行多表查询, 还可以使用" 外连接 " (左外连接, 右外连接)

如果两个表里面的记录都是存在对应关系, 内连接和外连接的结果是一致的, 如果存在不对应的记录, 内连接和外连接就会出现差别.

这种情况内连接和外连接一样

这种情况两者不一样

使用内连接情况一样

使用左外连接 left join, 保证左侧表的每个数据都会出现在最终结果里

使用右连接 right join, 保证右侧表的每个数据都会出现在最终结果里

自连接

一张表自己和自己进行笛卡尔积

有时候需要去进行行和行之间的比较, 而MySQL只能进行列和列的比较, 使用自连接把行的关系转换成列的关系

举个例子: 显示所有计算机原理比java成绩好的成绩信息

首先进行自连接, 这时需要将score改变为别名, 否则会报错

指定连接条件

精简

子查询

本质上实在" 套娃 ",把多个简单的MySQL拼成一个复杂的MySQL

单行子查询, 返回结果是一行记录

举个例子, 找到不想毕业同学的同班同学

分两步完成

现在一步完成

二者结果一致

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

举个例子: 查询 " 语文 " 或 " 英文 " 课程的成绩信息

使用联合查询可以解决

使用子查询完成

分两步走

合并查询

把多个sql查询的结果集合, 合并到一起. union关键字

查询id小于3, 或者名字为 " 英文 "的课程

两种的结果一样.后者允许把两个不同的表, 查询结果合并在一起. 但是两个合并的sql的结果集(列的个数和类型) 要一样;(名字不用管)

合并的时候是会去重的, 但是使用union all就不会去重

小结: 

1>  约束中, 主键约束 和外键约束 更难一点, 重点关注, 其他的也要动手敲一下

2> 表的设计(一对一, 一对多, 多对多)

3> 聚合查询 , 熟悉语法

4> 联合查询, 熟悉语法

加油, 很繁琐, 静下心来学.

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

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

相关文章

虚拟机镜像文件qcow2格式转vmdk

一、在esxi上虚拟机导出qcow2镜像文件 1、卸载数据盘、网卡 2、登录虚拟机所在物理服务器&#xff0c;查找系统盘名为vm-101-disk-0的文件位置 find / -name "vm-101-disk-0"使用命令导出qcow2镜像&#xff08;进度条走完就完成了&#xff09;&#xff1a; qemu…

基于FPGA的数字信号处理(10)--定点数的舍入模式(1)四舍五入round

1、前言 将浮点数定量化为定点数时&#xff0c;有一个避不开的问题&#xff1a;某些小数是无法用有限个数的2进制数来表示的。比如&#xff1a; 0.5(D) 0.1(B) 0.1(D) 0.0001100110011001~~~~(B) 可以看到0.5是可以精准表示的&#xff0c;但是0.1却不行。原因是整数是离散的…

蓝桥杯【第15届省赛】Python B组 32.60 分

F 题列表越界访问了……省一但没什么好名次 测评链接&#xff1a;https://www.dotcpp.com/oj/train/1120/ C 语言网真是 ** 测评&#xff0c;时间限制和考试的不一样&#xff0c;E 题给我整时间超限&#xff1f; A&#xff1a;穿越时空之门 100&#x1f3c6; 【问题描述】 随…

LLMs之unsloth:unsloth的简介、安装和使用方法、案例应用之详细攻略

LLMs之unsloth&#xff1a;unsloth的简介、安装和使用方法、案例应用之详细攻略 目录 unsloth的简介 0、特点和功能&#xff1a; 特点 功能 1、免费微调 2、Unsloth.ai新闻 3、链接和资源 4、主要特征 5、性能基准测试 unsloth的安装和使用方法 1、安装说明 Conda安…

牛客热题:链表的奇偶重排

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;链表的奇偶重排题目链接方法一&…

在家中访问一个网站的思考

在家中访问一个网站的思考 1、家庭网络简介2、家庭WLAN DHCP2.1、家庭路由器PPPOE拨号2.2、DHCP&#xff08;动态主机配置协议&#xff09;2.3、接入家庭网的主机IP地址2.4、家庭总线型以太网2.5、Mac地址2.6、ARP协议2.7、IP协议 & UDP/TCP协议2.8、NAT&#xff08;Netwo…

带你快速掌握Spring Task

Spring Task ⭐Spring Task 是Spirng框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑 &#x1f4cc;一款定时任务框架 应用场景 信用卡信息银行贷款信息火车票信息 只要是需要定时处理的场景都可以使用Spring Task 只要有定时&#xff0c;就会有…

论文润色就用意得辑:让你的学术之作更上一层楼

在学术的海洋里&#xff0c;每一篇论文都是一艘承载智慧与探索的小船。然而&#xff0c;好的内容也需要好的包装&#xff0c;才能更好地展现其价值。在这个追求精益求精的时代&#xff0c;意得辑以其专业的论文润色服务&#xff0c;成为了众多学者们的得力助手。 意得辑&#…

亚马逊自养号测评系统搭建技术要点解析

亚马逊自养号测评系统搭建技术要求主要涵盖了网络环境、IP管理、设备配置、浏览器防关联、支付卡选择与管理以及账号管理等多个方面。测评是否稳定长久这些条件都是缺一不可的&#xff0c;以下是一些具体的技术要求&#xff1a; 1. 网络环境&#xff1a;使用国外服务器在云端搭…

论文润色就用意得辑,打造学术精品新篇章

在学术的世界里&#xff0c;一篇优秀的论文如同璀璨的星辰&#xff0c;吸引着同行们的目光。然而&#xff0c;好的论文并非一蹴而就&#xff0c;它需要经过反复打磨、润色&#xff0c;才能焕发出夺目的光彩。在这个过程中&#xff0c;意得辑以其专业的服务、精湛的技巧&#xf…

geojson文件规格

geojson文件示例&#xff0c; {"type": "FeatureCollection","features": [{"type": "Feature","geometry": {"type": "Point","coordinates": [102.0, 0.5]},"properties&q…

Exness外汇大陆投资者开户详细流程!

Exness是一家全球领先的外汇和差价合约交易平台&#xff0c;因其高效稳定的服务和多样化的交易工具&#xff0c;受到广大投资者的青睐。然而&#xff0c;由于中国大陆用户无法直接访问Exness官网&#xff0c;想要开户的大陆投资者需要通过特定方式才能完成注册。本文将详细介绍…

windows10打印机共享完美解决方案

提到文件共享大家并不陌生,相关的还有打印机共享,这个多见于单位、复印部,在一个区域网里多台电脑共用一台打印机,打印资料非常方便,就包括在家里,我们现在一般都会有多台电脑或设备,通过家庭网络联接,如果共享一台打印机的话也是件便捷的事。 但是随着操作系统的更新…

哪个品牌的开放式耳机好用?五款畅销拔尖爆款力荐!

在耳机市场上&#xff0c;开放式耳机正逐渐成为一股新的风潮。它们以其独特的设计和卓越的音质吸引着越来越多的耳机爱好者。相较于传统的蓝牙耳机&#xff0c;开放式耳机不仅在音质上更胜一筹&#xff0c;更在佩戴舒适度上取得了显著突破。传统的蓝牙耳机&#xff0c;由于多采…

Spring Security Oauth2 JWT 添加额外信息

目录 一、问题描述 二、实现步骤 1、自定义TokenEnhancer 2、配置授权服务器 3、自定义UserDetails的User类 三、参考文档 一、问题描述 Oauth2里默认生成的JWT信息并没有用户信息&#xff0c;在认证授权后一般会返回这一部分信息&#xff0c;我对此进行了改造。 Oauth…

2024年数维杯数学建模A题思路

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

【Redis】Redis命令(四)

1.Geospatial 操作命令 一种由三部分构成的集合&#xff0c;这种数据结构称为空间元素。经度&#xff08;longitude&#xff09;&#xff1a;有效经度为[-180&#xff0c;180]。正的表示东经&#xff0c;负的表示西经&#xff1b;纬度&#xff08;latitude&#xff09;&#xf…

机器人系统仿真

0、何为仿真 通过计算机对实体机器人系统进行模拟的技术。 1、为何仿真 低成本&#xff1a; 机器人实体一般价格昂贵&#xff0c;为降低机器人学习、调试的成本&#xff1b;高效&#xff1a; 搭建的环境更为多样且灵活&#xff0c;可以提高测试效率以及测试覆盖率&#xff1b…

DevSecOps 是什么?你知道吗?

使用工具自动进行安全检查和扫描。这些工具包括静态应用程序安全测试 (SAST)、动态应用程序安全测试 (DAST) 和依赖性扫描。 什么是 DevSecOps&#xff1f; DevSecOps 是 DevOps 实践的自然演进&#xff0c;其重点是将安全集成到软件开发和部署流程中。 DevSecOps 一词代表了…

SQLSERVER CPU占用过高的优化

有同事反应服务器CPU过高&#xff0c;一看截图基本都是100%了&#xff0c;my god&#xff0c;这可是大问题&#xff0c;赶紧先看看。 让同事查看系统进程&#xff0c;发现是SQLServer的CPU占用比较高。首先想到的是不是报表生成的时候高&#xff0c;因为这块之前出现过问题&…