数据库系统原理 学习笔记 三
7. 表的定义
Sql的DDL:
定义一组关系+每个关系的信息,包括每个关系模式、每个属性的取值类型、完整性约束、每个关系维护的索引集合、每个关系的安全性和权限信息、每个关系在磁盘上的物理存储结构
- char(n):固定长度字符串,用户指定长度n
- varchar(n):可变长度字符串,用户指定最大长度n
- int:整数类型,等价于全称integer
- smallint:小整数类型
- numeric(p,d):定点数,精度由用户指定。这个数有p位数字,其中d位数字在小数点右边
- real,double precision:浮点数与双精度浮点数
- float(n):精度至少为n位的浮点数
- null:空值,每种类型都可以包含一个空值,除非申明属性值不为空。
- date:日期,含年月日
- time:时间,含时分秒
- timestamp:时间戳,年月日+时分秒
(sql server 2000中,日期和时间只有一种类型,即datetime) - 各数据库系统中有不同的函数,用于处理各种类型的数据及其类型转换,标准化程度低
完整性约束:
- not null,表明该属性不允许空值
- primary key(A1,…,An),属性A1,…,An构成关系的主码,主码属性必须非空且唯一
- foreign key(A1,…,Am)reference,表明关系中任意元组在数学A1,…,Am上的取值必须对应于s中某元组的主码属性上的取值
- check(P)P是谓词条件
基本模式定义
- Drop table r;
- Alter table r add A D; A是待添加属性的名字,D是待添加属性的类型
- Alter table r drop A; 很多数据库系统并不支持此操作
- Alter table r modify(A D);
8. Sql查询
- Between 代表闭区间
- From instructor,teaches;找出所列出关系上的笛卡尔积
- 集合运算Union、Intersect、Except
- 除了count(*),其他都忽略空值
- Sql查询语句执行顺序:from -> where -> group(agg function)-> having -> select -> order by
9. 嵌套子查询
- 位置:where和from子句
- 集合成员资格:in,not in
- 集合的比较:some,all
- 空关系测试:exists,not exists
- 重复元组存在性测试:unique,not unique
- From子句中的子查询
- With子句:提供定义临时关系的方法
10. 数据库的修改
- Insert
insert into r values();
insert into r1 select ID,18000 from r2 where;
- Delete
delete from r where
- Update
update r set c1 = e1 where
- case when
case when pred1 then result1 when pred2 then result2 else result0 end
11. 视图和索引
视图view
- 向用户隐藏特定的数据
- 视图可更新要求:from子句只有一个数据库关系;select子句只包含关系的属性名,不包含任何表达式、聚集或distinct声明;任何没有出现在select子句中的属性可以取空值,即这些属性没有not null约束,也不构成主码的一部分;查询中不含有group by或having子句
- 物化视图materialized view:特定数据库系统允许存储视图关系,保证如果用于定义视图的实际关系改变,视图也跟着修改
- 物化视图维护materialized view maintenance:定义的任何关系更新就维护;视图被访问时维护;周期性视图维护
索引
一个数据结构,允许数据库系统高效地找到关系中那些在索引属性上取给定值的元组,而不是扫描关系中的所以元组。只保留和查询有关的属性值,然后建立数据结构,如B+树,当用户查询时,先在索引里找到对应记录的指针,再通过指针,取出物理表中对应记录
Create index index_name on table_name (attribute_list)
12. 事务及完整性约束
事务transaction
- 隐式开始,显示结束
- commit work:提交当前事务,将该事务所做的更新在数据库中持久保持
- rollback work:回滚当前事务,撤销该事务中所有SQL语句对数据库的更新
完整性约束
- 域完整性、实体完整性(主键约束)、参照完整性(外键约束)、用户定义的完整性
- 单个关系上的约束:not null、unique、check(P)
- 域约束:定义了domain在创建表时可以直接用,
create domain Dollars as numeric (12,2) not null;
create domain Dollars as numeric (12,2) constraint salary_value_test check (value>=29000.00);
- 定义外键的目的:希望系统自动做参照完整性检查
数据库的修改导致参照完整性的破坏,- 插入。往参照关系中插入元组时,外码必须在被参照关系中实际存在或为null
- 删除。从被参照关系中删除元组时,要么报错撤销,要么参照关系中的元组需级联删除
- 更新。必须存在/报错/级联更新
级联动作
Foreign key (dept_name) references department [on delete cascade] [on update cascade]
- 参照完整性只在事务结束时检查
- 其他选择 on delete set null,on delete set default
- 外键最好使用not null来防止空值使SQL的参照完整性语义变得复杂