10.4 三范式总结
- 第一范式: 有主键,具有原子性,字段不可分割
- 第二范式:完全依赖, 没有部分依赖
- 第三范式: 没有传递依赖
- 【注意】:数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时可能会拿冗余换速度,最终用目的要满足客户需求。
- 一对一设计,有两种设计方案:
- 第一种设计方案:主键共享 (较少)
- 第二种设计方案:外键唯一
- 一对多设计:两张表,多 的表加外键
- 多对多设计:三张表,关系表两个外键
【注意】:设计是理论上的,实践和理论都是为了满足客户的需求,有的时候会拿冗余换速度。实际开发中,一切以客户需求为准。
五、34道作业题
5.1 — 5.5
【习题1】取得每个部门最高薪水的人员名称 ····// 先取得每个部门的最高薪资作为一张表 , 再和emp连接查询等值等部门的人员名称 select e.ename , a.sal , e.deptno from (select max(sal) sal , deptno from emp group by deptno) as a join emp e on a.sal = e.sal and a.deptno = e.deptno ; 【习题2】哪些人的薪水在部门的平均薪水之上 select distinct e.ename , e.sal from (select avg(sal) as sal , deptno from emp group by deptno) as a join emp e on (e.sal > a.sal and a.deptno = a.deptno); 【习题3】取得部门中(所有人的)平均的薪水等级 select e.deptno , avg(s.grade) from emp e join salgrade s on e.sal between s.losal and s.hisal group by deptno order by deptno asc ; 【习题4】不准用组函数( Max),取得最高薪水(给出两种解决方案) 方案一: select sal from emp order by sal desc limit 1 ; 方案二: select sal from emp where sal not in(select distinct a.sal from emp a join emp b on a.sal < b.sal); 【习题5】取得平均薪水最高的部门的部门编号(至少给出两种解决方案) 方案一: select deptno from emp group by deptno order by avg(sal) desc limit 1 ; 方案二: select deptno from emp group by deptno having avg(sal) = (select max(e.sal) from (select deptno , avg(