DQL 查询语句
排序
关键字说明:
asc 升序,默认
desc 降序
— 查询所有数据,使用年龄降序排序
select * from student order by age desc;
组合排序
— 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩升序排序
select * from student order by age desc, math asc;
聚合函数
使用聚合函数查询是纵向查询, 它是对一列的值进行计算,然后返回一个结果值。聚合函数会忽略空值 NULL。
SQL中的聚合函数 作用 | |
---|---|
max(列名) | 求这一列的最大值 |
min(列名) | 求这一列的最小值 |
avg(列名) | 求这一列的平均值 |
count(列名) | 统计这一列有多少条记录 |
---|---|
sum(列名) | 对这一列求总和 |
— 查询学Th总数
select count(id) as 总人数 from student;
select count(*) as 总人数 from student;
— 查询 id字段,如果为 null,则使用 0代替
select ifnull(id,0) from student;
select count(ifnull(id,0)) from student;
分组
GROUP BY 将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
— 按性别进行分组,求男Th和女Th数学的平均分
select sex, avg(math) from student3 group by sex;
— 对分组查询的结果再进行过滤
SELECT sex, COUNT() FROM student3 WHERE age > 25 GROUP BY sex having COUNT() >2;
having 与 where 的区别
子名 作用 | |
---|---|
where 子 句 | 1) 对查询结果进行分组前,将不符合 where条件的行去掉,即在分组之前过滤数据,即先过滤再分组。 2) where后面不可以使用聚合函数 |
having 子句 | 1) having子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤。 2) having后面可以使用聚合函数 |
limit 语句
limit 的作用:
limit是限制的意思,所以 LIMIT 的作用就是限制查询记录的条数。
— 查询学生表中数据,从第 3条开始显示,显示 6条。(分页查询)
select * from student3 limit 2,6;
LIMIT 的使用场景:
分页:比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。 假设我们每页显示 5 条记录的方式来分页。
数据库备份和还原
备份数据库中的数据
1) 选中数据库,右键 ”备份/导出”
2) 指定导出路径,保存成.sql文件即可。
还原数据库中的数据
1) 删除数据库
2) 数据库列表区域右键“执行 SQL脚本”, 指定要执行的 SQL文件,执行即可
数据库表的约束
约束种类:
约束名 约束关键字 | |
---|---|
主键 | primary key |
唯一 | unique |
非空 | not null |
外键 | foreign key |
检查约束 | check 注:mysql 不支持 |
主键约束
主键的作用:
用来唯一标识数据库中的每一条记录
哪个字段应该作为表的主键?
通常不用业务字段作为主键,单独给每张表设计一个 id 的字段,把 id 作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。
如:身份证,学号不建议做成主键
创建主键
主键关键字: primary key
主键的特点:
1) 非空 not null
2) 唯一
1.创建表时就创建主键
— 创建表学生表 st5, 包含字段(id, name, age)将 id 做为主键
create table st5 (
id int primary key , — id 为主键
name varchar(20),
age int
)
2. 在已有表中添加主键约束
alter table st5 add primary key (id);
删除主键
— 删除 st5表的主键约束
alter table st5 drop primary key;
主键自增
— 指定起始值为 1000, 如果不指定起始值默认从1开始
create table st4 (
id int primary key auto_increment,
name varchar(20)
) auto_increment = 1000;
创建好后修改起始值
alter table st4 auto_increment = 2000;
delete from st4 ;
# DELETE:删除所有的记录之后,自增长没有影响
TRUNCATE:删除以后,自增长又重新开始
truncate table st4;
唯一约束
什么是唯一约束: 表中某一列不能出现重复的值
关键字: unique
— 创建学Th表 st7, 包含字段(id, name),name 这一列设置唯一约束,不能出现同名的学Th
create table st7 (
id int,
name varchar(20) unique # 唯一约束
)
&主键约束在一张表中只能有一个,但是not null unique 在一张表中可以有多个&
非空约束
什么是非空约束:某一列不能为 null。
关键字: not null
— 创建表学Th表 st8, 包含字段(id,name,gender)其中 name不能为 NULL create table st8 (
id int,
name varchar(20) not null, gender char(1)
)
默认值
— 创建一个学Th表 st9,包含字段(id,name,address), 地址默认值是广州
create table st9 ( id int,
name varchar(20),
addressvarchar(20) default ‘广州’
)
— 添加一条记录,使用默认地址
insert into st9 values (1, ‘李四’, default); select * from st9;
— 不填也是使用默认值
insert into st9 (id,name) values (2, ‘李白’);
— 添加一条记录,不使用默认地址
insert into st9 values (3, ‘李四光’, ‘深圳’);
外键约束
什么是外键约束
什么是外键:在从表中与主表主键对应的那一列,如:员工表中的 dep_id
主表: 一方,用来约束别人的表
从表: 多方,被别人约束的表
1.已经建好表后创建外键约束
alter table [从表名字] constraint emp_depid_fk foreign key (dep_id) references department(id))
2.创建表时添加外键约束
— 多方,从表
create table employee(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int, — 外键对应主表的主键
constraint emp_depid_fk foreign key (dep_id) references department(id)) 或
foreign key (dep_id) references department(id))
)
删除外键约束
alter table employee drop foreign key emp_dept_fk;
外键的级联
什么是级联操作:
在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作
级联操作语法 描述 | |
---|---|
ON UPDATE CASCADE | 级联更新,只能是创建表的时候创建级联关系。更新主表中的主键,从表中的外键 列也自动同步更新 |
ON DELETE CASCADE | 级联删除 |
数据约束小结
约束名 关键字 说明 | ||
---|---|---|
主键 | primary key | 1) 唯一 2) 非空 |
默认 | default | 如果一列没有值,使用默认值 |
非空 | not null | 这一列必须有值 |
唯一 | unique | 这一列不能有重复值 |
外键 | foreign key | 主表中主键列,在从表中外键列 |
表与表之间的关系
员工表(多)
Id(主键) | Name | Age | Dep_id(外键)(唯一) |
---|---|---|---|
1 | 小明 | 20 | 1 |
2 | 小花 | 21 | 2 |
3 | 小周 | 22 | 2 |
4 | 小虎 | 20 | 4(错) |
一对多关系
部门表(一)
Id(主键) | name | loc |
---|---|---|
1 | 研发部 | 黄石 |
2 | 测试部 | 香港 |
3 | 产品部 | 大冶 |
一对多(1:n) 例如:班级和学生,部门和员工,客户和订单,分类和商品
一对多建表原则: 在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
用户表
U_id(主键) | Username | password |
---|---|---|
1 | 老王 | 123 |
2 | 张强 | 123 |
3 | 王五 | 123 |
多对多关系
中间表
U_id(外键)(主键) | R_id(外键)(主键) |
---|---|
1 | 1 |
1 | 2 |
1 | 3 |
2 | 1 |
3 | 1 |
多对多(m:n) 例如:老师和学生,学生和课程,用户和角色
多对多关系建表原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
角色表
R_id(主键) | rolename |
---|---|
1 | 项目经理 |
2 | 技术总监 |
3 | 程序员 |
一对一关系
一对一(1:1) 在实际的开发中应用不多.因为一对一可以创建成一张表。
(在一对多的多表也就是从表中的外键添加唯一约束,就成了一对一关系)
三大范式
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF)其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
1NF
数据库表的每一列都是不可分割的原子数据项,不能是集合、数组等非原子数据项。即表中的某个列有多个值时,必须拆分为不同的列。简而言之,第一范式每一列不可再拆分,称为原子性。
2NF
在满足第一范式的前提下,表中的每一个字段都完全依赖于主键。
所谓完全依赖是指不能存在仅依赖主键一部分的列。简而言之,第二范式就是在第一范式的基础上所有列完全
依赖于主键列。当存在一个复合主键包含多个主键列的时候,才会发生不符合第二范式的情况。比如有一个主键有两个列,不能存在这样的属性,它只依赖于其中一个列,这就是不符合第二范式。
第二范式的特点:
1) 一张表只描述一件事情。
2) 表中的每一列都完全依赖于主键
3NF
在满足第二范式的前提下,表中的每一列都直接依赖于主键,而不是通过其它的列来间接依赖于主键。
简而言之,第三范式就是所有列不依赖于其它非主键列,也就是在满足 2NF 的基础上,任何非主列不得传递依赖于主键。所谓传递依赖,指的是如果存在”A → B → C”的决定关系,则 C 传递依赖于 A。因此,满足第三范式的数据库表应该不存在如下依赖关系:主键列 → 非主键列 x → 非主键列 y
三大范式小结
范式 特点 | |
---|---|
1NF | 原子性:表中每列不可再拆分。 |
2NF | 不产生局部依赖,一张表只描述一件事情 |
3NF | 不产生传递依赖,表中每一列都直接依赖于主键。而不是通过其它列间接依赖于主键。 |
总结
1.where要在group by 前面使用,且where后面不能使用聚合函数
2.使用了group by 后,要查询的字段只能是group by子句或者聚合函数
3.having不能单独使用,和group by 搭配使用
4.外键没有唯一与非空要求
5.聚合函数会忽略null值,有相关需求是要搭配ifnull使用