MySQL约束
今日学习内容
1.DQL:查询语句
1.排序查询
2.聚合函数
3.分组查询
4.分页查询
2.约束
3.多表关系
4.范式
5.数据库备份和还原
DQL查询语句
排序
通过ORDER BY子句,可以将查询出的结果进行排序
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];
ASC:升序,默认值
DESC:降序
单列排序:只按某一个字段进行排序,单列排序
-- 查询学生表中所有数据,使用年龄进行降序排序
select * from Student order by age desc
组合排序:同时对多个字段进行排序,如果第一个字段相等,则按第二个字段排序,往后推
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 1 [ASC|DESC], 字段名 2 [ASC|DESC];
-- 查询学生表所有数据,在年龄上进行降序基础上,年龄相同则以分数升序排序
select * from student order by age desc,score asc;
聚合函数
聚合函数是纵向查询,是对一列的值进行计算,然后返回结果。
聚合函数会忽略空值NULL,解决:我们可以选择不包含非空的列计算,或者使用IFNULL函数
IFNULL(列名,默认值) 如果列名不为空,返回这列的值。如果为 NULL,则返回默认值。
-- 查询id字段,如果为null,则使用0代替
select ifnull(id,0) from student;
聚合函数
SQL中聚合函数 | 作用 |
max | 求这一列的最大值 |
min | 求这一列的最小值 |
avg | 求这一列的平均值 |
count | 统计这一列有多少条记录 |
sum | 对这一列求总和 |
-- 查询年龄大于18的总数
select count(*) from student where age>18;
-- 查询英语成绩总分
select sum(english) 总分 from student;
-- 查询英语成绩最低分
select min(english) 最低分 from student;
-- 查询英语成绩最高分
select max(english) 最高分 from student;
-- 查询英语成绩平均分
select avg(english) 平均分 from student;
分组
对查询信息进行分组,相同数据作为一组
SELECT 字段 1,字段 2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];
where和having的区别
1.where在分组之前进行限定,如果条件不满足,则不参与分组
having在分组之后进行限定,如果不满足结果,则不会被查询
2.where后不可跟聚合函数,having可以进行聚合函数的判断
-- 按照性别分组。分别查询男、女同学的平均分
select sex ,avg(english) from student group by sex;
-- 按照性别分组。分别查询男、女同学的平均分,人数
select sex ,avg(english), count(id) from student group by sex;
-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于60分的人,不参与分组
select sex,avg(score),count(id) from student where score >=60 group by sex;A
-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于60分的人,不参与分组,分组之后。人数要大于3个人
select sex,avg(score),count(id) from student where score>=60 group by sex having count(id)>3;
limit语句
LIMIT 的作用就是限制查询记录的条数。
SELECT *|字段列表 [as 别名] FROM 表名 [WHERE 子句] [GROUP BY 子句][HAVING 子句][ORDER BY 子句][LIMIT 子句];
格式
LIMIT offset,length;
-- offset:起始行数,从0开始,默认为0
-- length:返回的行数
-- 查询学生表信息,从第3行开始显示,显示5条
select * from student limit 2,5;
分页查询
limit 开始的索引,每页查询的条数;
开始的索引 = (当前的页码 - 1) * 每页显示的条数
-- 每页显示4条
SELECT * FROM student LIMIT 0,4; -- 第1页
SELECT * FROM student LIMIT 4,3; -- 第2页
SELECT * FROM student LIMIT 7,3; -- 第3页
约束
为什么要进行约束?
对表中的数据进行限制,保证了数据的正确性,有效性和完整性,添加了约束,错误的数据是无法被添加到表中的
约束分类
约束名 | 约束关键字 |
主键约束 | primary key |
唯一约束 | uniqe |
非空约束 | not null |
外键约束 | foreign key |
检查约束 | check 备注:mysql不支持 |
主键约束
- 主键的作用:用来唯一标识数据库的每一条记录
- 通常不用业务字段作为主键,一般每张表会单独设计一个id字段,把id作为主键。主键是给数据库和程序服务的,不是给客户使用的
- 主键的特点:非空(not null) 、唯一(不重复)
- 主键自增:数据库自动生成主键字段的值,AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)
创建主键
1.创建表时添加主键
字段名 字段类型 primary key
2.在已有表中添加主键
alter table 表名 add primary key(字段名);
-- 创建学生表stu,包含字段(id,name,age)id作为主键
create table stu(
id int primary key, --id为主键
name varchar(20),
age int
)
desc stu;
--删除主键
alter table stu drop primary key;
-- 添加主键
alter table stu add primary key(id);
修改自增长的默认起始值
默认自增长开始值是1,但是可以进行修改
创建表的起始值
create table 表名(
列名 int primary key auto_increment,
)auto_increment=起始值;
-- 指定起始值为100
create table stu1 (
id int primary key auto_increment,
name varchar(20)
) auto_increment = 100;
insert into stu1 values (null, '轩月');
select * from stu1;
结果: id name
100 轩月
-- 删除自动增长
alter table stu1 modify id int;
-- 添加自动增长
alter table stu1 modify id int auto_increment;
唯一约束
unique,表中某一列不能出现重复值
字段名 字段类型 uniqe
创建学生表stu2,包含字段(id,name)name列设置唯一约束,即不能出现同名的学生
-- 创建表时,添加唯一约束
create table stu2 (
id int,
name varchar(20) unique
);
-- null 没有数据,不存在重复的问题 ,列值可以有多个null
-- 删除唯一约束
alter table stu2 drop index name;
--创建表后,添加唯一约束
alter table stu2 modify name varchar(20) unique;
非空约束
某一列中不能为null
字段名 字段类型 not null
创建学生表stu3,包含字段(id,name,age)name不能为空null
-- 创建表时添加非空约束
create table stu3 (
id int,
name varchar(20) not null,
age int
);
-- 创建表后,添加非空约束
alter table stu3 modify name varchar(20) not null;
外键约束
foreign key,让表与从表产生关系
-- 创建表时,添加外键
create table 表名(
...
外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(猪表列名称)
);
-- 删除外键
alter table 表名 drop foreign key 外键名称;
-- 创建表后,添加外键
alter table 表名 add constraint 外键名称 foreign key(外键字段名称) references 主表名称(主表列名称);
级联操作:在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作
级联操作语法 | 描述 |
on update cascade | 级联更新,只能是创建表的时候创建级联关系。更新主表中的主键,从表中的外键 列也自动同步更新 |
on delete cascade | 级联删除 |
-- 添加级联操作
alter table 表名 add constraint 外键名称 foreign key(外键字段名称) references 主表名称(主表列名称) on update cascade on delete cascade ;
数据库设计
表与表间的关系
表与表间的三种关系 |
一对一(1:1) :员工表 简历表 等使用较少 |
一对多(1:n):员工和部门 最常用 |
多对多(m:n):学生选课表和学生表 ,一门课程多个学生选择,一个学生选择多门课程 |
数据规范化
什么是范式:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
一般用前三种范式
范式 | 特点 |
1NF | 原子性:表中每列不可拆分 |
2NF | 不产生局部依赖,一张表只描述一件事情,表中每一列都完全依赖于主键 |
3NF | 不产生传递依赖,表中每一列都直接依赖于主键,而不是通过其他列间接依赖于主键 |
几个依赖的概念
1.函数依赖:A--->B 通过A属性(属性组)的值,可以确定唯一B属性值,称为B依赖于A
// 学号-->姓名 (学号,课程名称-->分数)
2.部分函数依赖:A-->B,如果A是一个属性组,则B属性值确实只需要依赖A属性组某些值就可
//(学号,课程名称) -- > 姓名
3.完全函数依赖 :A-->B,如果A是一个属性组,则B属性值需要依赖A属性组所有的属性值
//(学号,课程名称) --> 分数
4. 传递函数依赖:A-->B, B-->C ,是如果存在"A → B → C"的决定关系,则 C 传递依赖于 A
//学号-->系名,系名-->系主任
5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
主属性:码属性组中的所有属性
非主属性:除过码属性组的属性
//例如表中码为:(学号,课程名称)
数据库的备份和还原
-- 备份
mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
-- 还原
1.登录数据库
2.创建数据库
3.使用数据库
4.执行文件 source 文件路径
-- 还原格式
use 数据库;
source 导入文件的路径;