目录
范式
- 函数依赖:如果可以通过属性(组)A,可以确定唯一的B,叫做B属性依赖A
- 部分函数依赖:通过属性(组)A中一部分值确定唯一的B 学号+课程 确定 学生姓名
- 完全函数依赖:通过属性(组)A中全部的值确定唯一的B 学号+课程 确定 分数
- 传递依赖:通过属性(组)A能确定唯一的属性(组)B,再通过属性(组)B确定唯一的属性(组)C,叫做C传递依赖A 学生姓名 确定 系别,系别 确定 系主任
- 主属性:表中存在属性(组),可以通过这个属性(组)确定表中其他属性的值
第一范式
指在关系模型中,对于添加的一个规范要求,所有域都应是原子性的
即所有的字段应是原子性,不能存在如下情况:
第二范式
在第一范式的基础上,非码属性必须完全依赖于其候选码
即一张表只表达一件事,分数完全依赖于学号和课程名称,但是系名仅仅完全依赖于学号,并不完全依赖于姓名与学号,因此需要将表拆分,否则会造成数据冗余和更新、删除、插入异常
第三范式
在第二范式的基础上,任何非主键属性不依赖于其他非主键属性,即不能有传递依赖出现
系名不应直接依赖于学号,而应该是系名依赖于系编号,系编号依赖于学号,所以应该再分割表
连接
笛卡尔积
A表的每一条记录都通过外键依次连接B表的每一条记录
select * from emp,dept;--得出14*4条记录
内连接
等同于笛卡尔积的基础上限制了外键相同
select * from emp inner join dept on emp.deptno = dept.deptno;--得出13条记录
--等同于
select * from emp,dept where emp.deptno = dept.deptno
--这样任何一边有外键为空的记录都会被忽略
外连接
左外连接
将左边的表作为驱动表,在右边的表中寻找对应外键相同的记录,就算驱动表的外键为null,也会自动往后补一个全是null的记录
select * from emp left join dept on emp.deptno = dept.deptno;--得出14条记录
--KING的记录7839,KING,PERSIDENT,,1981-11-17,5000,null/*deptno*/,null,null,null,null
右外连接
和左连接同理,只是将右边的表变成驱动表
自连接
自己和自己连接,这是一种需求,不是一个方式
select e.ename,m.ename from emp e left join emp m on e.mgr = m.empno;--得到14条记录
子查询
使用其他的查询结果,结果可以是单个值(单列单行)、集合(单行多列,单列多行)、表(多列多行)
事务
业务层面上的不可切割的整体,比如转账到对方接收成功就是一个事务,事务具有原子性、一致性、持久性、隔离性
事务并发:不同的事务操作相同的数据
可能产生的问题
- 脏读:事务B读到了事务A没有提交的数据,这个时候A可以提交也可以回滚操作。
- 不可重复读:针对update,事务A更新数据前事务B查询了一次,更新数据后事务B又查询了一次,导致两次查询结果不一致。
- 幻读:事务A删除了某条数据,但是事务B又插入了一条同样的数据,看起来就好像没删掉
解决方法
DCL
管理各个用户的权限,了解就行