目录
- DQL: 查询语句
- 排序查询
- 聚合函数
- 分组查询
- 分页查询
- 约束
- 多表时间的关系
- 范式
- 数据库备份和还原
DQL: 查询语句
-
排序查询
order by 子句; order by 排序字段1 排序方式2, 排序字段2 排序方式2... 排序方式: ASC: 升序 DESC: 降序 -- 按照数学排序, 如果数学一样, 则按照英语排序 SELECT * FROM student ORDER BY math, english; -- 如果有多个排序条件, 则当前面的条件值一样时, 才会判断第二个条件.
-
聚合函数: 将一列数据做整体, 进行纵向计算.
-
count: 计算个数
一般选择非空的列, 例如: 主键
-
max: 计算最大值
-
min: 计算最小值
-
avg: 计算平均值
聚合函数的计算, 排除null值了. 解决方法:
- 选择不包含非空的列
- IFNULL函数
SELECT COUNT(`name`) FROM student; SELECT COUNT(IFNULL(english,0)) FROM student; SELECT MAX(math) FROM student; SELECT MIN(math) FROM student; SELECT SUM(math) FROM student; SELECT AVG(math) FROM student;
-
-
分组查询
group by 分组字段;
分组之后可以查询的字段: 分组字段, 聚合函数
where 和 having区别:
where在分组之前限定, 如果不满足条件, 不参与分组
having在分组之后限定, 如果不满足having条件, 不被查询
-- 按性别分组并计算平均分 SELECT sex, AVG(math), COUNT(id) FROM student GROUP BY sex; -- 按性别分组并计算分数大于70分的平均分 SELECT sex, AVG(math), COUNT(id) FROM student WHERE math > 70 GROUP BY sex; -- 按性别分组并计算分数大于70分的平均分, 并且分组之后分数大于2 SELECT sex, AVG(math), COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2; SELECT sex, AVG(math), COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;
-
分页查询
limit 开始索引, 查询的条数
-- 每页显示三条记录 SELECT * FROM student LIMIT 0,3; -- 第一页 SELECT * FROM student LIMIT 3,3; -- 第二页 -- 公式: 开始的索引 = (当前页码 - 1) * 每页数 SELECT * FROM student LIMIT 6,3; -- 第三页
limit是一个MySQL的
方言
约束
-
概念: 对表中的数据进行限定, 保证数据的正确性, 有效性和完整性.
-
分类:
- 主键约束: primary key
- 非空约束: not null
- 唯一约束: unique
- 外键约束: foreign key
主键约束
- 非空且唯一
- 一个表只能有一个字段是主键
- 主键就是表中记录的唯一标识
-
创建表时添加主键
CREATE TABLE stu(id INT PRIMARY KEY, name VARCHAR(20));
-
创建表之后添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
-
删除主键
ALTER TABLE stu MODIFY id int; -- 错误,不生效 ALTER TABLE stu DROP PRIMARY KEY;
-
自动增长
-
如果某一列是数值类型, 使用
auto_increment
可以用来完成值的自动增长.-- 创建表时添加自动增长 CREATE TABLE stu(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20)); -- 删除自动增长 ALTER TABLE stu MODIFY id INT; -- 添加自动增长 ALTER table stu MODIFY id INT PRIMARY KEY AUTO_INCREMENT;
-
非空约束: not null
-
创建表时添加约束
CREATE TABLE stu(id INT, name VARCHAR(20) NOT NULL);
-
创建表完之后添加非空约束
ALTER TABLE stu MODIFY `name` VARCHAR(20) NOT NULL; ALTER TABLE stu CHANGE `name` `name` VARCHAR(20) NOT NULL;
-
删除非空约束
ALTER TABLE stu MODIFY `name` VARCHAR(20); ALTER TABLE stu CHANGE `name` `name` VARCHAR(20);
唯一约束: unique
同一列的值不能重复
-
创建表时添加唯一约束
CREATE TABLE stu(id INT, phone VARCHAR(20) UNIQUE); -- 注意: MySQL中, 唯一约束限定的列的值可以有多个null
-
创建表后添加
ALTER TABLE stu MODIFY phone VARCHAR(20) UNIQUE;
-
删除唯一约束
ALTER TABLE stu MODIFY phone VARCHAR(20); -- 不能通过这种方式 ALTER TABLE stu DROP INDEX phone;
注意: MySQL中唯一约束限定的列的值可以有多个null
外键约束
CREATE TABLE emp ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(30), age INT, dep_name VARCHAR(30), dep_location VARCHAR(30) );
-- 添加数据 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州'); INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州'); INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州'); INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳'); INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳'); INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳');
-- 数据有冗余 -- 解决方案:分成 2 张表 -- 创建部门表(id,dep_name,dep_location) -- 一方,主表 create table department( id int primary key auto_increment, dep_name varchar(20), dep_location varchar(20) ); -- 创建员工表(id,name,age,dep_id) -- 多方,从表 create table employee( id int primary key auto_increment, name varchar(20), age int, dep_id int, -- 外键对应主表的主键 CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) ); -- 添加 2 个部门 insert into department values(null, '研发部','广州'),(null, '销售部', '深圳'); select * from department; -- 添加员工,dep_id 表示员工所在的部门 INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1); INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1); INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1); INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2); INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2); INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2); select * from employee;
-- 删除外键 ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk; -- 添加外键 ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id); emp_dept_fk是外键名称 -- 添加外键, 设置级联更新 ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE; -- 添加外键, 设置级联删除 ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON DELETE CASCADE; -- 同时设置 ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE;
数据库的设计
-
多表之间的关系
-
分类
- 一对一:
- 人和身份证
- 分析: 一个人有一个身份证, 一个身份证对应一个人
- 一对多(多对一):
- 部门和员工
- 分析: 一个部门有多个员工, 一个员工只能对应一个部门
- 多对多:
- 如: 学生和课程
- 分析: 一个学生可以选择多个课程, 一个课程可以被多个学生选择
- 一对一:
-
实现:
- 一对多:
- 部门和员工
- 实现方式: 在多的一方建立外键, 指向一的一方的主键.
- 多对多:
- 学生和课程
- 实现方式: 多对多关系实现需要借助第三张中间表,中间表至少包含两个字段, 这两个字段作为第三张表的外键, 分别指向其他两张表的主键.
- 一对一:
- 学生和身份证
- 实现方式: 可以在任意一方添加唯一(unique)外键指向另一方的主键.
- 一对多:
-
案例:
分类表
cid ame x x 线路表
rid name price cid 用户表
uid username password 中间表
rid uid 分类1 线路表N 一对多
线路表N 用户M 多对多, 中间表
-
-
数据库设计的范式
- 第一范式: 每一列都是不可分割的原子数据项
- 第二范式: 在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
- 第三方是: 在2NF的基础上, 任何非主属性不依赖于其他非主属性(在2NF基础上消除传递依赖)
数据库备份和还原
- 命令行
- mysqldump -u用户名 -p密码 数据库名称 > 保存路径
- 还原
- 登录数据库
- 创建数据库
- 使用数据库
- 执行文件. source 文件路径
- 图形化工具