回顾
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张表的关系