数据库的设计
-
1· 多表之间的关系及实现方式
- 一对一
- 一对多
在多的一方设置外键,指向另一方的主键 - 多对多
借助第三张表,中间至少包含两个字段,这两个字段为两张表多的主键,作为第三张表的外键
-
2·范式
数据库的六种范式:第一范式、第二范式、第三范式、BCNF 范式、第四范式、第五范式- 第一范式
每一列都是不可以分割的原子数据项 - 第二范式
在第一范式的基础上,消除非主属性对主码的部门函数依赖
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的值,B属性(组)能够确定C的值,那么C传递函数依赖于A。
5·码:一张表中,被其他所有属性完全依赖的属性(组)成为码;
主属性:码属性组中的所有属性
非主属性:除去码属性的所有属性 - 第三范式
在第二范式的基础上,消除传递依赖
- 第一范式
-
3· 多表查询的分类
- 内连接:查询什么字段,从那张表,条件
1·隐式内连接:使用where条件进行查询。
例如:查询员工表的姓名,部门表的名称
select emp.ename,dept.dname from emp,dept where emp.dept_id = dept.id;
2·显示内连接:select 字段列表 from 表名称[ inner] join 表名称2 on 条件
例如:查询员工表的姓名,部门表的名称
select emp.ename,dept.dname from emp inner join dept on emp.dept_id = dept.id; - 外连接
1·左外连接:
select 字段列表 from 表1 left [outer] join 表2 on 条件
可以查询的是左边表的所有数据以及交集的部分
2·右外连接:
select 字段列表 from 表1 right [outer] join 表2 on 条件
可以查询的是右边表的所有数据以及交集的部分 - 子查询
概念:查询中的嵌套查询;
例如:查询员工表中工资最高的员工信息
select * from emp where emp.salary = (selet max(salary) from emp);
子查询的不同情况:
1·查询结果是单行单列:子查询可以作为条件,使用条件运算符去判断的。
2·查询的结果是多行单列的:where 后面同个字段多种类型的,可以使用in来判断
3· 查询的结果是多行多列的:子查询可以成为一张新的表参与查询。
- 内连接:查询什么字段,从那张表,条件
事务
如果一个包含多个步骤的业务条件,被事务管理,那么这些操作要么同时成功要么同时失败。
- 事务的三个操作:
1·开启事务:start transaction;
2·回滚:rollback;
3·提交:commit; - 事务的提交方式:
1· 自动提交:
(mysql数据库事务默认为自动提交)(一条DML增删改语句就会自动提交一次)
2·手动提交:
需要先开启事务,然后再提交
修改事务默认的提交方式的方法:
(1)查看事务的默认方式:select @@autocommit;
(2)修改:set @@autocommit = 0;(1–代表自动提交;0–代表手动提交) - 事务的四大特征:
1·原子性:不可分割的最小操作单位,要么同时成功,要么同时失败
2·持久性:当事务提交或者回滚后,数据库会持续化的保存数据
3·隔离性:多个事务之间,相互独立
4·一致性: 事务操作前后,数据总量不变
– 今天到这里,明天继续!