MySQL表的CRUD进阶武功

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL表的CRUD进阶武功

写在前面

我们上篇博客,学习了MySQL的基础增删查改操作!

当我们需要将多张表的数据组织在一起或是多张表多有联系,那么该如何去创建表!

如何实现增删查改功能呢!

我们本篇博客就带大家来学习一下mysql表的一些稍微复杂的操作!


数据库约束

not null- 指示某列不能存储 NULL 值。

unique- 保证某列的每行必须有唯一的值。

default - 规定没有给列赋值时的默认值。

primary key - not null 和 nuique的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。

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

check - 保证列中的值符合指定的条件。对于MySQL数据库,对check子句进行分析,但是忽略check子句。

null约束


创建表时可以指定某列不为空!


image.png

我们指定了student_1表中name和score不能为空!

当我们插入一个空值时:

image.png

可以看到但我们name为空时,插入失败!

正确插入方式是要将name和score都赋予值,不能为空!

image.png

注意:

这里的指定列不为空语法是:

属性 类型 not null

只需要在某一列后面写上not null

切记:is not null是条件语句!


nuique:唯一约束


指定某一列中的数据,唯一的,不重复!

就比如我们的身份证号:每个人都是唯一的!

image.png

我们设置了id为(unique)唯一约束,那么id就不能重复!


default默认值约束


指定插入值时,name为空 ,有默认值!

就相当于,我们不想让对方知道我们的姓名,我们就采用匿名的方式!

image.png

这就好比现在双减政策下,我们不能将学生的成绩排名公之于众,只有采用这种匿名的方式,很好解决了!


primary key:主键约束


指定id为主键!

那么id既不能是null也需要瞒住unique唯一性;

image.png

image.png


扩展: 对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1


--主键约束 primary key 是 unique 和 not null的结合!
id int primary key auto_increment

image.png

当我们使用了auto_increment时,如果主键没有赋值,那么自动赋值为该表中的最大值加1;


foreign key:外键约束


外键用于关联其他表的主键(primary key)或唯一键(unique)

比如好多表互相有联系时!那么我们就需要用到foreign key外键约束!

SQL语句

foreign key (字段名) references 主表(列名)


学生信息和班级信息就需要使用外键约束!

image.png

当我们外键约束的表中插入,主表中不含的数据时,插入数据失败!!!

因为没有103这个班级,所以这个学生信息有误!!!


check约束


MySQL使用时不报错,但忽略该约束


当我们table表中的某些字段的值含有那么几个默认的选项! 那么我们就可以用check检查是否满足!

比如 性别 属性 只有男或者女!当我们插入的数据性别不为这二者时显然信息错误! 而check便可以很好的检测出!

image.png

然而并未起到作用…这个了解一下即可!!!


表的设计

三大范式


一对一

一个人只有一个身份证号!!!

一对多

一个班级里有好多学生

多对多

一个课程有多个学生上,一个学生要上多个课程

新增

我们可以在一张表中插入其他表的查询结果!!!


将student_2表中的数据插入到student_1中


必须是两个表对应的字段类型匹配才可以!!!


image.png

我们已经成功将student_2表中的名字信息插入到了student_1表!


查询

聚合查询

聚合函数

常见的的统计计数,计数平均值等,可以通过聚合函数来实现,常见的聚合函数如下:

image.png 

count


查询多少学生!

image.png



sum


查询总分

image.png


avg


查询每科平均成绩

image.png

max


查询最大值

image.png



min


查询最小值

image.png


group by 子句

select中使用 group by 子句可以对指定列进行分组查询。需要满足:使用 group by进行分组查询时,select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中。

也就是说,group by子句可以通过列进行分组!

例如下方的emp中根据 role这一列我们可以将该表分成多组!

image.png

根据role分组

image.png

查询不同role组中的人数 平均薪水,最高薪水,最低薪水!

image.png

having

group by子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用where语句,而需要用having显示平均工资低于1500的角色和它的平均工资!


联合查询

实际上我们的数据库,查询数据时,如果有多张表的数据,我们采用多表查询,多表查询通常采用笛卡尔积的方式!

啥是笛卡尔积呢???


笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 [1] --来自百度 。

image.png

通俗点说就是,R表和S表,笛卡尔积后变成了RXS表如果R表有n*m S表有x*y,那么RXS就是n*x行 m*y列!!!


那么笛卡尔积有什么用呢?

当我们需要查询一个学生表对应的班级表时,我们便可以借助笛卡尔积!!!

image.png

但是我们可以看到使用笛卡尔积后,学生表和班级表中的班级id并没有一一对应! 所以当我们使用笛卡尔积查看两张表时需要加一些限制条件!!!

image.png

当我们加了一个限制条件后,where class.id = student.class_id;

我们便可以将两张表的对应关系找出来!~!!!


内连接

SQL语句

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

select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;

我们可以通过上述语句进行内连接!!!

使用where限制条件!!!

image.png

查找qq为112的学生!!!

image.png

使用join on限制条件!!!

表1 join 表2 on 条件

image.png外连接

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


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

我们先查看这两张表的内容!!

image.png

当我们使用内连接,左外连接,右外连接时区别如下:

内连接:

image.png


左外连接:

image.png



右外连接:

image.png



自连接

自连接是指同一张表连接自身查询!

案例:

显示所有数学成绩比语文成绩高的人的成绩的学生信息!

如果我们这张表中的每一门成绩都在一列中,那么显然我们只要使用一个where判断一下即可!

比如:

image.png

但是如果每门的成绩并不是在单独的一列中,那该如何查询呢?

这时就需要用到自连接了!!!

就比如下方我们有三张表 分别为成绩表和学生表和课程表!

如果我们要查询java程序设计成绩比数据库原理成绩高的学生信息该如何操作呢?

image.png

自连接就是将行改成列!!!

将一直表起多个别名,就得到多张表!!!

通过笛卡尔积,我们就可以将这两张表中的行变成列!

我们先对成绩表进行笛卡尔积!!!

一开始的成绩表:

image.png


可以看到学生id为1的学生的课程成绩都在一列中!!

而我们要将不同科目的成绩放在不同的列才能进行比较!!!

进行笛卡尔积后的成绩表:

image.png

选择课程java程序设计和数据库原理的课程id!!!


image.png

我们将两门课的成绩分别放在了一个列中了!!!


我们再进行限定就可以找到满足条件的学生信息

image.png

最后查询java程序设计比数据库原理的课程成绩高的学生信息!!!

image.png


步骤有点繁琐!!!

原理就是将行转化成列!

将一张表期别名利用笛卡尔积转化!!!


子查询

子查询简单讲就是,多个sql查询语句的嵌套!!!

就是套娃!!!

不建议的操作! 反人类!

代码可读性差

了解一下即可!

如果我们要查询java程序设计的成绩!!

我们第一步要获取到这个课程的id

image.png

然后通过这个课程id在成绩表中寻找即可!!!

image.png

子查询就一步即可!!!

image.png

显然这玩意除了能装外没啥用!!!


合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用union和union all时,前后查询的结果集中,字段需要一致!

我们就是可以用union 和 union all在相同表或者不同表中合并多个select 相当于 单表查询中的or


union


查询刘备和曹操的成绩信息:

or

image.png


union

image.png


union和union all可以合并多个sql语句! 可以在不同的表中进行查询!!!


union all


union all 和union唯一的区别就是 union all不会去掉结果集中的重复行! 而union会进行去重!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5月前
|
存储 SQL 关系型数据库
MySQL语句详解:从基础到进阶的全面指南
MySQL语句详解:从基础到进阶的全面指南
|
6月前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
3月前
|
关系型数据库 MySQL 数据库
MySQL 表的CRUD与复合查询
【9月更文挑战第26天】本文介绍了数据库操作中的 CRUD(创建、读取、更新、删除)基本操作及复合查询。创建操作使用 `INSERT INTO` 语句插入数据,支持单条和批量插入;读取操作使用 `SELECT` 语句查询数据,可进行基本查询、条件查询和排序查询;更新操作使用 `UPDATE` 语句修改数据;删除操作使用 `DELETE FROM` 语句删除数据。此外,还介绍了复合查询,包括连接查询(如内连接、左连接)和子查询,以及聚合函数与分组查询,并提供了示例代码。
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库开发进阶:精通数据库表的创建与管理22
【7月更文挑战第22天】数据库的创建与删除,数据表的创建与管理
50 1
|
4月前
|
前端开发 Java 关系型数据库
通过HTML网页对mysql数据库进行增删改查(CRUD实例)
通过HTML网页对mysql数据库进行增删改查(CRUD实例)
252 0
|
6月前
|
JSON 关系型数据库 MySQL
MySQL常用函数解读:从基础到进阶的全方位指南
MySQL常用函数解读:从基础到进阶的全方位指南
|
5月前
|
存储 SQL 关系型数据库
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
|
5月前
|
SQL 存储 数据库
MySQL设计规约问题之如何处理日志类型的表
MySQL设计规约问题之如何处理日志类型的表
|
5月前
|
运维 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在处理MySQL表新增数据记录时,没有正确触发变更事件,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL 关系型数据库 MySQL
ClickHouse(23)ClickHouse集成Mysql表引擎详细解析
ClickHouse的MySQL引擎允许执行`SELECT`查询从远程MySQL服务器。使用`MySQL('host:port', 'database', 'table', 'user', 'password'[,...])`格式连接,支持简单`WHERE`子句在MySQL端处理,复杂条件和`LIMIT`在ClickHouse端执行。不支持`NULL`值,用默认值替换。系列文章涵盖ClickHouse安装、集群搭建、表引擎解析等主题。[链接](https://zhangfeidezhu.com/?p=468)有更多
270 0