1.数据与数据模型
•数据
– 给定事实
•数据模型
– 抽象的, 自含的, 对象和操作符等的逻辑定义, 所有这些一起组成了抽象机
•实现
– 真实机器上的物理实现
•数据抽象
–实体与联系
实体(Entities)
supplier, part, project, warehouse, employee ….
联系(Relationships)
sp, sj, spj…….
–特征 (Properties)
供应商 : location….
零件 : weight …..
2.数据独立
•数据库技术的主要目标
•适应应用需求,数据物理表示和访问技术的改变是必要的
•两类独立性
物理数据独立
- 当数据库的内部存储结构发生改变时,只要修改模式/内模式映象,可保持概念模式不变,从而保持外模式以及用户程序的不变,保证了数据与程序的物理独立性——数据的物理独立性
逻辑数据独立
- 当概念模式发生改变时,只要修改外模式/模式映象,可保持外模式不变,从而保持用户应用程序不变,保证了数据与用户程序的逻辑独立性——数据的逻辑独立性
3.体系结构
•三层体系结构
•外模式
- 单个用户所看到的局部数据的逻辑结构和特征的描述
- 建立在概念模式之上,同一概念模式上可有多个不同的外模式
- 通过外模式DDL进行定义
•概念模式
- 数据库中全体数据的逻辑结构和特征的描述
- 一个数据库只有一个概念模式
- 通过模式DDL进行定义
•内模式
- 数据物理结构和存储方式的描述
- 一个数据库只有一个内模式
- 通过内模式DDL定义
4.关系模型
•术语
域 (Domain)
- 一组具有相同数据类型的值的集合。每个属性有一个域
属性 (Attribute)
- 二维表格的每一列
元组 (Tuple)
- 每一行称为关系的一个元组
基数 (Cardinality) 元组的数目
度 (Degree) 列的数目
•性质
一个关系是一个规范化的二维表格
- 属性值不可分解
不允许表中有表
- 元组不可重复
因此一个关系模式至少存在一个候选码
- 没有行序,即元组之间无序
关系是元组的集合,集合的元素是无序的
- 没有列序,即属性之间无序
关系模式是属性的集合
•操作
- 选择 (select)
从表中抽取指定的行
- 投影 ( Project)
从表中抽取指定的列
- 连接 (Join)
在公共列的基础上连接两个表
- 以集合为单元操作
算子和结果都是表
- 闭包性质
一个操作的的输出结果可以是另一个操作的输入
•Key
- 候选键(Candidate Keys)
当且仅当如下条件成立K 是关系R候选键
- 唯一性(Uniqueness)
- 最小性(Irreducibility)
- e.g. S(s#) 是键,
S(s#, age) 是超键( super key )
- 主关键字(Primary Keys)与候选键
Primary key 是被关系选中的候选键
- 主关键字不能取空值(not null)
- 外关键字(Foreign Key)
– R2 是一关系, R2 中的外关键字是R2的一组属性, FK, 满足:
- 存在关系R1 有候选键 CK
R2 中的每个FK 值一定与 R1中某个元组的CK值相等.
引用完整性
数据库不能含有任何不匹配的外关键字
- ON DELETE
CASCADE/RESTRICT/NO ACTION
- ON UPDATE
CASCADE/RESTRICT/NO ACTION
解释:引用关系做删除和更新操作的影响:CASCADE跟随一起变化,RESTRICT受限,不允许删除和更新,NO ACTION 不变化——引用完整性受到影响。
•语言 (SQL,代数)
DDL 数据库定义语言
- 创建create
– Table
– View
– Index
- 例:
创建表:
Create Table DEPT ( DEPT# Number,
DNAME Char(5),
Budget Number( 7,2));
创建索引:
Create index I1 on EMP (E#);
Create index I2 on EMP (Ename);
创建唯一性索引:
Create unique index I1 on EMP (E#);
创建聚集索引(
元组按照索引值顺序,物理上尽可能的存储在一起 ,在索引值上执行扫描(scan)操作时可以减少 I/O.):
Create cluster index CI1 on EMP (E#);
含有完整性定义得关系定义例子:
Create Table SP ( s# s# not null,
p# p# not null, qty qty not null,
primary key (s#, p#),
foreign key (s#) references S
on delete cascade
on update cascade,
foreign key (p#) references P
on delete cascade
on update cascade,
check (qty >0 and qty <5001) );
DML数据库操纵语言
- 查询select
- 例:
查询年龄40岁以下不同部门平均工资大于6000的部门,并按部门降序列表。
select d#, avg (SAL) from EMP where age < 40
group by d# having avg (SAL) > 6000
order by d# desc;
查询在sale部门工作的职工名。
select distinct Ename from EMP where d# in
(select d# from DEPT
where Dname=‘sale’)
查询缺少某门课成绩的学生学号。
Select s# From SC Where score IS NULL
查询只选修了1门或2门课程的学生学号、姓名和课程数。
Select student.s#, sname, count_c# From (Select s# as s#, count(s#) as count_c# From sc Group by s#) SC2, student Where sc2.s# = student.s# and (count_c#=1 OR count_c#=2)
删除delete
例:
删除所有低于平均工资的职工 。
delete from EMP where SAL < (select avg (SAL) from EMP)
插入insert
例:
insert into S (status, city, s#, sname) values (20, ‘shanghai’, ‘s6’, ‘wang ping’ );
对所有在黄山路 支行的贷款者$200 存款的礼物。
insert into account select loan-number, branch-name, 200 from loan where branch-name = ‘huangshanlu’
更新update
例:
工资大于 $4,000 的增加 6%, 其他职工工资增加 5%.
嵌入SQL
- 单元组查询
EXEC SQL Select Ename INTO :ename
From EMP Where e# = ‘e1’
- 查询供应了amount 数量零件的供应商名字和其所在的城市,先定义游标( cursor)
EXEC SQL
declare c cursor for
select sname, city
from S, SP
where S.s# = SP.s#
and SP.QTY > :amount
游标打开语句( open ),执行游标查询
EXEC SQL open c
游标取语句(fetch )获取一个元组送入主变量
EXEC SQL fetch c into :cn, :cc
通过循环调用fetch语句,获取所有元组
游标关闭语句( close )
EXEC SQL close c
游标更新定义
declare c cursor for select * from EMP where city = ‘Parise’ for update
修改当前游标元组
update EMP set SAL = SAL + 100 where current of c
- 关系代数
- 关系代数的符号
关系代数表达式
- 并
R∪S={t∣t∈R∨t∈S}
–t是元组变量
–R和S是关系代数表达式
–R与S的degree必须相同
–R与S的属性类型必须相同
- 交
R∩S={t∣t∈R∧t∈S}
- 差
- 积
- 选择
–水平划分关系
–F是一个逻辑表达式,表示所选的元组应满足的条件
–F由逻辑运算符┐(NOT)、∧(AND)、∨(OR)连接算术表达式构成
•算术表达式形为XθY,θ可以是>,<,=, ≤,≥或≠,X和Y可以是属性名、常量或简单函数
- 投影
- 自然联接
设R的属性集为{X,Y},S的属性集为{Y,Z}
R∞S=t|t=<X,Y,Z>∧t[X,Y]∈R∧t[Y,Z]∈S}
–相当于在R×S中选取R和S的所有公共属性值都相等的元组,并在结果中去掉重复属性
- θ联接
- 等值联接
在θ联接中,当θ为等号时,称为“等值联接”
等值联接是θ联接中比较常见的形式
- 关系代数封闭性
任意关系代数操作的结果仍是一个关系
关系代数的封闭性保证了关系代数操作的可嵌套性
- 关系代数-删除
例:“从数据库中删除姓名为‘Rose’的学生”
Student←Student-σname=‘Rose’(Student)
- 关系代数-插入
例:插入一个新的学生
S1←S1∪ { (‘001’,’Rose’,19) }
- 关系代数-修改
例:“将所有男学生的学号前加上字母M”
Student←π‘M’||sno,name, sex, age(σsex=‘M’(Student)) ∪ (Student-σsex=‘M’(Student))
- 关系代数-查询
例:查询所有状态大于20的供应商的供应商号
查询供应了London城市中零件的供应商号
查询状态大于20并且没有零件的城市
- 关系代数与SQL
例:
供应商关系模式:S (S#, SNAME, STATUS, CITY)
求住在同一个城市里的供应商号码对