MySQL中表的增删查改(进阶),超详细!(上)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: MySQL中表的增删查改(进阶),超详细!

一、数据库的约束

1、约束类型

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

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

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

PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。(用来作为一个记录的身份标识,一个表里面只能有一个主键,设置为主键的那一列不能为null

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

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

2、NULL约束

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

代码展示:

create table student(id int not null, sn int, name varchar(20), qq_mail varchar(20));

3、UNIQUE:唯一约束

指定sn列为唯一的、不重复的:

代码展示:

create table student(id int not null, sn int unique, name varchar(20), qq_mail varchar(20));

有了unique约束后,sn列里面的数据就不能重复

如果sn插入相同的数据就会失败

4、DEFAULT:默认值约束

指定插入数据时,name列为空,默认值unkown:

代码展示:

create table student(id int not null, sn int unique, name varchar(20) default '大白兔', qq_mail varchar(20));

我们插入一些数据

可以看到name列的数据都为“大白兔”,我们并没有初始化name这个列的数据,但是因为我们使用了default约束,默认了name列的数据为“大白兔”。

5、PRIMARY KEY:主键约束(主键只能定义一个,NOT NULL 和 UNIQUE 的结合)

指定id列为主键:

代码展示:

create table student(id int primary key, sn int unique, name varchar(20) default '大白兔', qq_mail varchar(20));

结果如下:

如果定义两个主键则会报错,如下图:

如图,如果我们再插入id为1的数据,就会报错

因为我们把id设置了为主键,那么id这个列它不允许有null值,也不允许有重复的数据,因为主键约束的列数据是唯一的

主键不允许重复,那么我们怎么它不重复呢?

MySQL自身给我们提供了一种机制:“自增主键”(primary key auto_increment)

如图:

那么如果我们插入数据的时候,就不用指定id了,MySQL会自动帮我们加1,保证id列上的数据不重复

如图展示:

如果我们手动加一个id为10的数据,再次添加只有name列的数据,id让MySQL自动添加,它自动添加的值是多少呢?如图

可以看到,id是3到9的数据会跳过,从10开始自增。

那如果我们把id = 10和id = 11的数据删除呢?

可以看到,id是从之前已经存过的数据,但是删除了的开始自增,并不会从3开始自增。

所以,每次没有指定id或者指定为null时插入主键自增的时候。都是数据库会根据当前列的最大值进行自增,并且这里的自增是不会重复利用之前的值的

看到这,你会不会觉得这样太浪费空间了?

       其实这么做确实会浪费一点空间,但是MySQL的数据是存储到硬盘上的,硬盘本身也比较便宜,而且这么做也能省去一些麻烦事,用MySQL进行编程也会更简单,减轻我们在实际开发中的工作量,浪费这么点空间就浪费了,硬盘空间有不值钱。

6、FOREIGN KEY:外键约束

外键约束是指有两张表,一个表作为父表,一个表作为子表,父表约束着子表,在子表插入数据的时候,被外键约束的那一列插入的数据在父表也必须有,没有的话就不能插入;

同时,子表对父表也有一定的约束,例如,子表被约束的那列数据是和父表约束子表的那一列数据是一样的,父表可能会有多,但子表有的父表一定有,这时,我们就不能随便更改或删除父表约束列的那一数据了,因为改了子表和父表的约束数据就不一样了,这也就是子表对父表有一定约束的原因。

语法:foreign key (字段名) references主表()

创建class表,创建时id是用了主键约束。

代码展示:

create table class(classId int primary key, name varchar(20));

创建student表,创建时是用了外键约束。

代码展示:

create table student(id int, name varchar(20), classId int primary key, foreign key (classId) references class(classId));

创建的两张表如图:

class表的内容:

我们试着对student插入数据试试,如图

当我们插入外键约束中父表没有的数据,如图:

插入失败了,同时,我们试着删除或者更改父表外键约束的数据,如图:

也是删除或者修改失败了

7、CHECK约束(了解)

保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。对于MySQL没啥用,了解即可。

 


二、表的设计

表的设计就是根据需求,把把你需要的表创建出来,做法:

1)        根据需求找实体

2)        梳理清楚实体之间的关系

一对一

如图:

例子:教务系统,需要表示一个概念,学生(实体),需要一个学生表示这个实体,还有一个概念,账户(实体),需要一个账户表示这个实体

实体:学生,账户

关系:一个学生只有一个账户,一个账户只能给一个学生使用

设计方案

方案一:把学生和账户都放进一个表里进行管理(这两个表都很简单,列很少,可以考虑合并)

方案二:分两个表,一个是学生表,一个是账户表,通过id引用将两个表联系起来(一对一)如图

一对多

如图:

例子:教务系统,有一个实体,学生,还有一个实体,班级

实体:学生,班级

关系:一个班级可以包含多个学生,一个学生只能从属一个班级

设计方案:

如图

多对多

如图:

例子:教务系统,学生是一个实体,课程也是一个实体

实体:学生,课程

关系:一个学生可以选多门课程,一个课程也可以被多个学生选择

设计方案:如图

没关系(两个实体毫不相干)

直接各自创建各自的表,比较简单,没有关联

总结:

表的设计要确定实体的关系,造句,往里套,能套上哪个就用那种方式创建数据表


三、新增

插入查询结果

语法:insert into 表名 values select 要查询的表...

例子:把student表的所有数据都插入到student2表中

我们现有两张表,列的结构是一样的,如图

现在,把student的表数据全部插入到student2中

代码:

insert into student2 select * from student;

如图

注意:要插入查询的结果,那么要插入的数据列结构和被插入的数据列结果要相同,可以指定列插入,也可以插入多个查询结果


四、查询

1、聚合函数

(1)聚合函数

       常见的聚合函数

常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:

       案例

COUNT:

查看查询数据的行数:

如图:

注意:

count(*)不管列里面的数据有没有null值,查询出来的行数都是总行数

但如果是某一列,则有null值的那一行数据就不会被算进去

如图:

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
SQL 关系型数据库 MySQL
MySQL基本操作——增删查改
MySQL基本操作——增删查改
8 2
|
12天前
|
NoSQL 关系型数据库 MySQL
【MySQL探索之旅】MySQL数据表的增删查改——约束
【MySQL探索之旅】MySQL数据表的增删查改——约束
|
24天前
|
关系型数据库 MySQL
一文带你拿下MySQL之增删查改(基础)(下)
一文带你拿下MySQL之增删查改(基础)
|
24天前
|
关系型数据库 MySQL
一文带你拿下MySQL之增删查改(基础)(上)
一文带你拿下MySQL之增删查改(基础)
|
7月前
|
SQL 安全 关系型数据库
MySQL数据库中的增删查改(MySQL最核心,工作中最常用的部分)
MySQL数据库中的增删查改(MySQL最核心,工作中最常用的部分)
159 0
|
4月前
|
关系型数据库 MySQL 数据处理
『 MySQL数据库 』表的增删查改(CRUD)之表的数据插入及基本查询(下)
『 MySQL数据库 』表的增删查改(CRUD)之表的数据插入及基本查询(下)
|
4月前
|
关系型数据库 MySQL 数据库
『 MySQL数据库 』表的增删查改(CRUD)之表的数据插入及基本查询(上)
『 MySQL数据库 』表的增删查改(CRUD)之表的数据插入及基本查询(上)
|
5月前
|
安全 关系型数据库 MySQL
一文带你拿下MySQL之增删查改(基础)(下)
一文带你拿下MySQL之增删查改(基础)
35 0
|
5月前
|
关系型数据库 MySQL
一文带你拿下MySQL之增删查改(基础)(上)
一文带你拿下MySQL之增删查改(基础)
35 0
|
6月前
|
SQL 关系型数据库 MySQL
MySQL中表的增删查改(进阶),超详细!(下)
MySQL中表的增删查改(进阶),超详细!
40 0