数据库具备良好的设计:
1NF:每个属性不可再分(关系型数据基本要求)
2NF:提供PK 主属性 保证实体完整性
3NF:解除了非主属性之间的依赖关系 拆表
目前采用3NF,好处:减少数据的冗余,解决了数据不一致问题,从而形成了一种良好设计
如何实现两张表的关系:1、主键-外键(主外键关系)2、其他
表分类:
1)内连接 特点:数据会严格匹配 inner join
(1)等值连接、(2)非等值连接、(3)自连接
2)外连接 对内连接的补充 outer join 特点:解决的是一个都不能少的问题
(1)左外连接、(2)右外连接、(3)全外连接
内连接:
1、等值连接(两张表是等值关系 =)
ps:2张表:select 字段值 from 表1 inner join 表二 on 条件
3张及以上:select 字段值 from 表1、表2、表3... where 条件
2、非等值连接(两张表非等值关系:> < >= <= between and in(...))
3、自连接 (如果一张表中的两个字段之间有关系,可以采用自连接)
eg:s_emp id PK 员工id;manager_id FK 领导id 参照与同表的员工id(领导也是员工)
查询出员工名字和领导名字的对应关系
分析:当一张表中两个字段有关系时,使用自连接【将一张表通过起别名的方式,模拟2张表,将一张表中两个字段关系转化为两张表两个字段之间的关系】
select e.first_name,m.first_name
from s_emp e,s_emp m
where e.manager_id=m.id
如果 某人的manager_id为空,将造成该记录消失
空值影响1:空值参与运算,结果为空 nvl函数转化
空值影响2:空值和任何值,包括空值本身都无法直接比较(匹配),结果都为假
内连接总结:内连接会进行数据的严格匹配,可能会造成数据的丢失(空值影响)
外连接:
1、左外连接 left join... on 保证左边表的每个记录都不能少 ps:oracle特有语法:要想让左边表的记录一个都不能少,在对方表添加(+)
eg: select e.id,e.name,d.name from t_emp e,t_dpt d where e.dept_id =d.id(+)
等同于 select e.id,e.name,d.name from t_emp e left join t_dpt d on e.det_id=d.id;
【保证左表也就是员工表内容不会丢失,即使没有部门id】
ID NAME NAME
---------- --------------- ---------
5 Ajax Java
1 Tom Java
6 Nill C++
2 James C++
4 Tony DB
3 Mary
2、右外连接 right join...on保证右边表的记录每个记录都不能少 ps,oracle特有语法同上
eg:select e.id,e,name,d.id from t_emp e,t_dep d where e.name(+)=d.id
等同于 select e.id,e.name,d.id from t_emp right join e,t_dep d on e.dep_id=d.id
【正确显示右表也就是部门表 每个部门下的员工,即使部门的人数为空】
ID NAME NAME
---------- --------------- -------
1 Tom Java
2 James C++
4 Tony DB
5 Ajax Java
6 Nill C++
Web
3、全连接 full outer join...on 保证两边表的记录一个都不能少 ps:oracle 不允许两边同时使用(+)
eg:select e.id,e.name,d.id from t_emp full outer join e,t_dep d on e.dep_id=d.id
ID NAME NAME
---------- --------------- ----------
5 Ajax Java
1 Tom Java
6 Nill C++
2 James C++
4 Tony DB
3 Mary
Web
外连接总结:一个都不能少
使用标准
sql
三张表连接
(
了解
)
需求:查询
Mark
在哪个地区上班
?
【
t_emp *---1 t_dept *---1 t_region
id dept_id(FK) = id(PK)
region_id(FK) = id(PK)】
select e.name r.name
from ( t_emp e inner join t_dep d on e.dep_id=d.id)
inner join t_regin r
on d.region_id=r.id and e.name='Mark'
NAME NAME
------------------------- ---------------
Mark North America