暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库基础: MySQL约束(第二天)

老李的Java学习日记 2019-04-07
271

MySQL约束 


回顾 

MySQL管理数据库 

创建数据库

删除数据库


表的管理 

查看所有表

创建表:student(整数id,字符串name,整数age)


查看一个表结构 

查看创建表的sql语句


修改表结构 

向学生表中添加1列remark varchar(100)

删除学生表列remark

修改表student名字为student1

 

删除表 


管理数据:数据增删改DML 

插入数据

修改数据

删除表中的所有数据


学习目标 

1. 能够使用SQL语句进行排序 

2. 能够使用聚合函数

3. 能够使用SQL语句进行分组查询 

4. 能够完成数据的备份和恢复 

5. 能够使用SQL语句添加主键、外键、唯一、非空约束 (重点,重点,重点)

6. 能够说出多表之间的关系及其建表原则 




第1章 DQL语句 


DQL查询语句-条件查询 

目标 

能够掌握条件查询语法格式 


讲解 

前面我们的查询都是将所有数据都查询出来,但是有时候我们只想获取到满足条件的数据 

语法格式:

流程:取出表中满足条件的记录 


准备数据 

比较运算符 

> 大于 

< 小于 

<= 小于等于 

>= 大于等于 

= 等于 

<> 、 != 不等于



具体操作:

查询math分数大于80分的学生

查询english分数小于或等于80分的学生


查询age等于20岁的学生

查询age不等于20岁的学生


逻辑运算符 

and(&&) 多个条件同时满足 

or(||) 多个条件其中一个满足 

not(!) 不满足


具体操作:

查询age大于35且性别为男的学生(两个条件同时满足)

查询age大于35或性别为男的学生(两个条件其中一个满足)

查询id是1或3或5的学生


in关键字 语法格式:

in 里面的每个数据都会作为一次条件,只要满足条件的就会显示


具体操作:

查询id是1或3或5的学生

查询id不是1或3或5的学生


范围 

比如: age BETWEEN 80 AND 100 相当于: age>=80 && age<=100

具体操作:

查询english成绩大于等于75,且小于等于90的学生


小结 

比较运算符

> 大于 

< 小于 

<= 小于等于 

>= 大于等于 

= 等于 

<> 、 != 不等于


逻辑运算符 

and&& 

or||

not!

in (值,值,值) between 值1 and 值2: 包含开始和结束




模糊查询like 

目标 

能够掌握模糊查询语法格式

讲解 

LIKE 像表示模糊查询

满足 通配符字符串 规则的数据就会显示出来 所谓的 通配符字符串 就是 含有通配符的字符串 MySQL 通配符有两个 

% : 表示零个一个多个字符(任意多个字符) 

_ : 表示一个字符


具体操作:

查询姓马的学生

查询姓名中包含'德'字的学生

查询姓马,且姓名有三个字的学生

小结 

模糊查询格式: SELECT * FORM 表名 WHERE 字段 LIKE '规则';

% :可以表示任意多个字符 

_ :表示一个字符 




DQL查询语句-排序 

目标 

1. 能够掌握对查询的数据进行排序

讲解 

通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)

ASC: 升序(不写默认就是升序) DESC: 降序


1.2.1 单列排序

单列排序就是使用一个字段排序

具体操作:

查询所有数据,使用年龄降序排序


1.2.2 组合排序

组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。 上面的例子中,年龄是有相同的。当年龄相同再使用math进行排序

具体操作:

查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序

小结 

1. 排序的关键字:ORDER BY 

2. 升序:ASC 

3. 降序:DESC 



DQL查询语句-聚合函数 

目标 

能够掌握五个聚合函数的使用 


讲解 

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值。


五个聚合函数:

count : 统计指定列记录数,记录为NULL的不统计 

sum : 计算指定列的数值 和,如果不是数值类型,那么计算结果为0 

max : 计算指定列的最大值 

min : 计算指定列的最小 值 

avg : 计算指定列的平均值


聚合函数的使用:写在 SQL语句 SELECT 后 字段名 的地方

具体操作:

查询学生总数

我们发现对于NULL的记录不会统计



统计数量常用:

查询年龄大于40的总数

查询数学成绩总分


查询数学成绩最高分

查询数学成绩最低分

查询数学成绩平均分


小结 


DQL查询语句-分组 

目标 

能够对查询后的结果进行分组



讲解 

分组查询是指使用 GROUP BY 语句对查询信息进行分组

GROUP BY怎么分组的? 将分组字段结果中相同内容作为一组

这句话会将sex相同的数据作为一组


GROUP BY 将分组字段的相同值作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。

分组后聚合函数的作用?不是操作所有数据,而是操作一组数据。


效果如下:

注意事项:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的



查询的时候没有查询出分组字段 


查询的时候查询出分组字段 

具体步骤:

按性别分组

查询男女各多少人


查询年龄大于25岁的人,按性别分组,统计每组的人数

查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据 有很多同学可能会将SQL语句写出这样:

注意: 并只显示性别人数>2的数据属于分组后的条件,对于分组后的条件需要使用 having 子句

having与where的区别

having是在分组后对数据进行过滤 

where是在分组前对数据进行过滤 

having后面可以使用聚合函数 

where后面不可以使用聚合函数


 小结 

1. 分组的语法格式?

    SELECT 字段 FROM 表名 WHERE 条件 GROUP BY 字段; 

2. 分组的原理?

    将相同的数据分成一组,返回每组第一条数据(意义不大),通常分组后会跟聚合函数做统计 

3. where和having的区别? 

    having是在分组后对数据进行过滤 

    where是在分组前对数据进行过滤 

    having后面可以使用聚合函数 

    where后面不可以使用聚合函数



DQL查询语句-limit语句 

目标 

能够掌握limit语句的使用


讲解 

准备数据:

LIMIT 是 限制 的意思,所以 LIMIT 的作用就是限制查询记录的条数。


LIMIT语句格式:

offset 是指偏移量,可以认为是跳过的记录数量,不写则默认为0。 length 是指需要显示的总记录数


具体步骤:

查询学生表中数据,跳过前面2条,显示6条

LIMIT的使用场景:分页

比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。假设我们一每页显示5条记录的方式来分页。

假设我们一每页显示5条记录的方式来分页,SQL语句如下:


注意:

如果第一个参数是0可以简写: 

SELECT * FROM student3 LIMIT 0,5; SELECT * FROM student3 LIMIT 5; 


LIMIT 10,5; -- 不够5条,有多少显示多少 


小结 

1. LIMIT语句的使用格式?

2. 



数据库备份 

目标 

1. 能够使用命令行的方式备份和还原表中的数据 

2. 能够使用图形客户端来备份和还原数据 


讲解 

备份的应用场景

在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比如发生意外停机或存储介质损坏。这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补与估量的。


命令行方式备份与还原 

备份格式:

注意:这个操作不用登录

还原格式:

注意:还原的时候需要先登录MySQL,并选中对应的数据库

具体操作

备份day22数据库中的数据


还原day22数据库中的数据

删除day22数据库中的所有表 

登录MySQL

选中数据库

使用SOURCE命令还原数据


图形化界面备份与还原 

备份day22数据库中的数据   选中数据库,右键 ”备份/导出”,指定导出路径,保存成.sql文件即可。  

 

包含创建数据库的语句  

还原day22数据库中的数据 

    删除day22数据库 

    数据库列表区域右键“执行SQL脚本”, 指定要执行的SQL文件,执行即可 

 

小结 

1. 使用命令行的方式备份和还原表中的数据 

备份:不需要登录: mysqldump -u账号 -p密码 数据库 > 文件路径 

还原:需要登录,选中数据库: source 文件路径 

2. 使用图形客户端来备份和还原数据 



数据库约束的概述(重点,重点,重点) 

目标 

能够说出数据库约束的作用 


讲解 

数据库约束的作用 

对表中的数据进行进一步的限制,保证数据的正确性有效性完整性。 


约束种类 

PRIMARY KEY : 主键约束 

UNIQUE : 唯一约束 

NOT NULL : 非空约束 

DEFAULT : 默认约束 

FOREIGN KEY : 外键约束 


小结 

1. 数据库约束的作用? 

对表中的数据进一步限制,保证数据的正确性,完整性,有效性 



主键约束 

目标 

1. 能够说出主键约束的作用 

2. 能够添加和删除主键约束 


讲解 

主键的作用 

能够唯一的区分一条记录 


为什么需要主键约束 

有些记录的 name,age,score 字段的值都一样时,那么就没法区分这些数据,造成数据库的记录不唯一,这样就不方便管理数据。

 

 

每张表都应该有一个主键,并且每张表只能有一个主键。 


哪个字段作为表的主键 

通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。


创建主键  

主键的特点

    主键必须包含唯一的值 

    主键列不能包含NULL值


创建主键方式:

1. 在创建表的时候给字段添加主键


2. 在已有表中添加主键


具体操作:

创建表学生表st5, 包含字段(id, name, age)将id做为主键


添加数据

插入重复的主键值

插入NULL的主键值



删除主键 

具体操作:

删除st5表的主键


小结 

1. 说出主键约束的作用? 

    唯一的区分一条记录 

2. 主键的特点? 

    唯一 非空 

3. 添加和删除主键? 

    创建表时添加主键: 字段名 字段类型 PRIMARY KEY 

    在已有表上添加主键: ALTER TABLE 表名 ADD PRIMARY KEY(字段名) 

    删除主键   ALTER TABLE 表名 DROP PRIMARY KEY   



主键自增 

目标 

能够设置主键为自动增长 


讲解 

主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值

AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)


具体操作:

创建学生表st6, 包含字段(id, name, age)将id做为主键并自动增长


插入数据

扩展 默认地AUTO_INCREMENT 的开始值是1,如果希望修改起始值,请使用下列SQL语法


DELETE和TRUNCATE的区别

DELETE 删除表中的数据,但不重置AUTO_INCREMENT的值。

 

TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1 



小结 

1. 设置主键为自动增长格式?

 字段名 字段类型 PRIMAYR KEY AUTO_INCREMENT 



唯一约束 

目标 

1. 能够说出唯一约束的作用 

2. 能够添加唯一约束 


讲解 

唯一约束的作用 

同一表中的字段值不能重复 


唯一约束的基本格式 


具体步骤:

创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生

添加一些学生

小结 

1. 说出唯一约束的作用? 

    同一表中某个字段的值不能重复 

2. 添加唯一约束格式? 

    字段名 字段类型 UNIQUE 



非空约束 

目标 

1. 能够说出非空约束的作用 

2. 能够添加非空约束 


讲解 

非空约束的作用 

某个字段的值不能为NULL 


非空约束的基本语法格式 


具体操作:

创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL

添加一些完整的记录


小结 

1.非空约束的格式:

    字段名 字段类型 NOT NULL


2.扩展: 主键唯一,非空,普通的字段我们也可以添加唯一和非空.有区别吗? 

    有: 一个表只能有一个主键, 一个表可以将多个字段设置成唯一 非空


3.主键可以设置自动增长, 普通的字段不能设置自动增长 



默认值 

目标 

1. 能够说出默认值的作用 

2. 能够给字段添加默认值 


讲解

默认值的作用 

往表中添加数据时,如果不指定这个字段的数据,就使用默认值 


默认值格式 

具体步骤:

创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州

添加一条记录,使用默认地址

添加一条记录,不使用默认地址


小结 

1. 说出默认值的作用? 

    不指定值,就会使用默认值 

2. 给字段添加默认值格式? 

    字段名 字段类型 DEFAULT 值 



外键约束 

目标 

1. 能够说出外键约束的作用 

2. 能够创建外键约束 


讲解 

单表的缺点 

创建一个员工表包含如下列(id, name, age, dep_name, dep_location),id主键并自动增长,添加5条数据

缺点:表中出现了很多重复的数据(数据冗余),如果要修改研发部的地址需要修改3个地方。


解决方案:将一张表分成2张表(员工表和部门表)


问题: 当我们在employee的dep_id里面输入不存在的部门,数据依然可以添加.但是并没有对应的部门,不能出现这种情况。employee的dep_id中的内容只能是department表中存在的id 

需要达到目的:需要约束dep_id只能是department表中已经存在id 

解决方式:使用外键约束 


什么是外键约束 

一张表的某个字段,引用另一张表的主键

主表: 主键所在的表,约束别人的表,将数据给别人用 

副表/从表: 外键所在的表,被约束的表,使用别人的数据


创建外键 

1. 新建表时增加外键:

关键字解释: CONSTRAINT: 约束 FOREIGN KEY(外键字段名): 表示外键 REFERENCES 主表名 (主键字段名) : 引用某张表的主键 


2. 已有表增加外键:


具体操作:

    副表/从表: 被别人约束,表结构添加外键约束 

    删除副表/从表 employee 

    创建从表 employee 并添加外键约束


正常添加数据

部门错误的数据添加失败

删除外键 

具体操作:

删除employee表的emp_depid_ref_dep_id_fk外键

在employee表情存在况下添加外键


小结 

1. 创建外键约束格式? 

创建表时添加外键: CREATE TABLE 表名 ( 字段名 字段类型,   CONSTRAINT 外键名 FOREIGN KEY(外键字段) REFERENCES 主表(主键) ); 


在已有表基础上增加外键 ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字 段) REFERENCES 主表(主键) 


2. 删除外键格式? 

ALTER TABLE 表名 DROP FOREIGN KEY 外键名; 




外键的级联 

目标 

了解外键的级联操作 


讲解 

要把部门表中的id值2,改成5,能不能直接修改呢?

不能直接修改:Cannot delete or update a parent row: a foreign key constraint fails 如果副表(员工表)中有引用的数据,

不能直接修改主表(部门表)主键


要删除部门id等于1的部门, 能不能直接删除呢?

不能直接删除:Cannot delete or update a parent row: a foreign key constraint fails 如果副表(员工表)中有引用的数据,不能直接删除主表(部门表)数据 


什么是级联操作 

在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作 ON UPDATE CASCADE -- 级联更新,主表更新时,从表跟着更新 ON DELETE CASCADE -- 级联删除,主表删除是,从表跟着删除


具体操作:

删除employee表 

重新创建employee表,添加级联更新和级联删除

再次添加数据到员工表和部门表

把部门表中id等于1的部门改成id等于10

删除部门号是2的部门

小结 

级联更新:ON UPDATE CASCADE 主表更新时,从表跟着更新

级联删除:ON DELETE CASCADE 主表删除时,从表跟着删除



表关系的概念 

目标 

能够理解表之间的3种关系 


讲解 

现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,老师和学生等。 那么我们在设计表的时候,就应该体现出表与表之间的这种关系!分成三种:

1. 一对一 

2. 一对多 

3. 多对多 



一对多

例如:班级和学生,部门和员工,客户和订单,分类和商品 

一对多建表原则: 在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键


多对多 

例如:老师和学生,学生和课程 多对多关系建表原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。

一对一 

在实际的开发中应用不多.因为一对一可以创建成一张表。 两种建表原则

外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一 UNIQUE 

外键是主键:主表的主键和从表的主键,形成主外键关系 



一对多关系练习 

目标 

以下案例是我们JavaWeb课程最后的小项目.我们拿出其中一部分需求,根据需求来设计数据库表之间的关系

一个旅游线路分类中有多个旅游线路


讲解 

具体操作:

创建旅游线路分类表

添加旅游线路分类数据

创建旅游线路表

添加旅游线路数据

小结 

一对多的关系,创建表的顺序:先建主表,再建从表。

 


多对多关系练习 

目标 

一个用户收藏多个线路,一个线路被多个用户收藏


讲解 

对于多对多的关系我们需要增加一张中间表来维护他们之间的关系

具体操作:

创建用户表

添加用户数据

创建收藏表

增加收藏表数据

小结 

一对多:在多方(从表)建立外键引用主表的主键

多对多:创建一张中间表,中间表与其它两张表是多对一的关系



总结 

1. 能够使用SQL语句进行排序 

    SELECT 字段 FROM 表名 WHERE 条件 ORDER BY 字段; 

2. 能够使用聚合函数 

    SELECT 聚合函数 FROM 表名; 

    COUNT: 统计数量 

    MAX:获取最大值 

    MIN:获取最小值 

    AVG:获取平均值 

    SUM: 获取总和 

3. 能够使用SQL语句进行分组查询 

    SELECT 字段 FROM 表名 WHERE 条件 GROUP BY 字段; 

4. 能够完成数据的备份和恢复 

    命令行:   

        1.备份,不需要登录:mysqldump -u账号 -p密码 数据库 > 文件路径  

        2.恢复,需要登录:选 择数据库:source 文件路径 

    图形界面:

        1选中数据库,右键 ”备份/导出”,指定导出路径,保存成.sql文件即可。

        2 数据库列表区域右键“执行SQL脚本”指定要执行的SQL文件,执行即可 

 5. 能够使用SQL语句添加主键、外键、唯一、非空约束 

    主键: 字段名 字段类型 PRIMARY KEY 

    外键: CONSTRAINT 外键名 FOREIGN KEY(外键字段) REFERENCES 主表(主键) 

    唯一: 字段名 字段 类型 UNIQUE 

    非空约束: 字段名 字段类型 NOT NULL 

    默认约束: 字段名 字段类型 DEFAULT 值 

6. 能够说出多表之间的关系及其建表原则 

    一对多:在从表(多方)建立外键,引用主表的主键 

    多对多: 建立中间表维护2张表的关系


文章转载自老李的Java学习日记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论