约束
六大约束:primary key(主键约束)、foreign key(外键约束)、unique(唯一性约束)、not null(非空约束)、default(默认值约束)、check(自定义约束)
primary key、not null 在之前的文章已经提到了
unique 和主键的区别:主键不可以为null, unique可以为null
当我们插入外键的值的时候,那么他就会去关联外键的表里面去找有没有该值,假如有,就插入,假如没有,就不让插入,报错,在工作中,一般不使用外键
多表设计
- 一对一
例如:学生和学号,商品和商品详情,一般把它们合并,放到一个表里面去
但是有时候需要进行拆分,例如商品对应库存,主要从性能的角度考虑 - 一对多
例如:班级和学生,订单和商品
关系维护在多的一方 - 多对多
例如:学生和课程、用户和商品
新建一个关系表去维护
三大范式
- 每列保持原子性
要求表的每个字段必须是不可分割的独立单元。
- 记录唯一性
每张表只表达一个意思。表的每个字段都和表的主键有依赖。 -
数据不要冗余
每张表的主键之外的其他字段都只能和主键有直接依赖(绝对)关系。
但是我们在设计表的时候,可能因为一定原因(比如:为了方便)而使表的数据冗余提高,即反范式化操作,它可以给我们带来查询性能上的巨大提升,一切要以实际情况以及需求而定。
连接查询
-
内连接(用的最多)
//内连接
select * from customer inner join orders on orders.customer_id = customer.id where customer.name = '郭靖';
//隐式内连接
select * from customer as c,orders as o where c.id = o.customer_id and c.name = '郭靖';
- 左外连接
select * from customer as c left join orders as o on c.id = o.customer_id;
- 右外连接
select * from orders as o right JOIN customer as c on c.id = o.customer_id;
- 子查询
select * from orders where customer_id = (select id from customer where name = '郭靖');
-
联合查询
select * from t_students where chinese > 80
union
select * from t_students where class = '二班';
数据恢复与备份
// 数据备份
mysqldump -u root -p database_name sql.sql
// 数据恢复
source [sql文件全路径]