01-5数据库连接

数据库具备良好的设计:
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值