[关闭]
@3013216027 2016-01-28T13:18:57.000000Z 字数 18744 阅读 3982

《数据库原理》总纲

数据库原理复习专栏


1. 关系数据模型

数据模型概述

关系模型基础

在SQL中定义关系模式

代数查询语言(关系代数)☆

关系上的约束☆

关系代数符号表(含扩展)

符号形式 含义及说明
投影,从中选出属性
选择,为条件
笛卡尔积
自然连接
连接
重命名
消除重复
扩展投影
排序
分组
外连接
聚集

习题

  1. create table Product (
  2. maker varchar(64),
  3. model varchar(32),
  4. type varchar(16),
  5. primary key (model)
  6. );
  1. create table PC (
  2. model varchar(16),
  3. speed float(6,2),
  4. ram int,
  5. hd int,
  6. price float(8,2),
  7. primary key (model)
  8. );
  1. create table Laptop (
  2. model varchar(16),
  3. speed float(6,2),
  4. ram int,
  5. hd int,
  6. screen float(3,1),
  7. price float(8,2),
  8. primary key(model)
  9. );
  1. create table Printer (
  2. model varchar(16),
  3. color boolean default false,
  4. type varchar(16),
  5. price float(8,2),
  6. primary key (model)
  7. );
  1. alter table Printer drop color;
  1. alter table Laptop add od varchar(6) default 'none';
  1. alter table Classes drop bore;
  1. alter table Ships add yard varchar(32);

2. 关系数据库设计理论

函数依赖☆

函数依赖的规则

BCNF☆

chase检验

3NF

多值依赖MVD%


3. 高级数据库模型

ER模型☆

设计原则

ER模型中的约束

弱实体集

ER图到关系设计

子类结构到关系的转化

ER图元素及其含义

元素 含义/作用
矩形 实体集
菱形 联系
椭圆 属性
双框矩形 弱实体集
双框菱形 连接弱实体集的多对1联系
三角形 连接实体集和它的子类
连线段 连接<实体集-属性>或<实体集-联系>
箭头 多对1关系(箭头指向"多对1"中的"1")
下划线 被下划线标记的属性属于键的一部分
圆箭头 引用完整性(箭头指向被引用的实体集)
边上的数字 度约束,如"<=10"

4. 代数和逻辑查询语言

关系代数的扩展操作☆


5. SQL语句

简单查询☆

多关系查询

子查询

全关系操作

数据库更新

SQL中的事务

隔离级别(isolation) 脏读 不可重复读 幻读
未提交读
已提交读
可重复读
可串行化

习题


6. 约束和触发器

键和外键

  1. create table education (
  2. from_date date not null,
  3. to_date date not null,
  4. id int not null
  5. references student (id)
  6. on update cascade
  7. on delete set null,
  8. primary key (id, from_date)
  9. );

属性和元组上的约束☆

修改约束

断言☆

  1. create assertion richPres check
  2. (not exists
  3. (select Studio.nam
  4. from Studio, MovieExec
  5. where pres = cert and netWorth < 1000000
  6. )
  7. );

触发器

  1. create trigger <name>
  2. <after|before> <update|delete|insert|update of <column name>>
  3. referenecing
  4. old row as oldtuple
  5. new row as newtuple
  6. for each row
  7. ...

习题

  1. alter table Movies add constraint fkMoviesMovieExec
  2. foreign key (producer) references MovieExec (name);
  1. alter table Movies add constraint fkMoviesMovieExec
  2. foreign key (producer) references MovieExec (name)
  3. on update set null
  4. on delete set null;
  1. alter table Movies add constraint fkMoviesMovieExec
  2. foreign key (producer) references MovieExec (name)
  3. on update cascade
  4. on delete cascade;
  1. alter table StarsIn add constraint fkStarsInMovies
  2. foreign key (movieTitle) refereneces Movies (title);
  1. alter table StarsIn add constraint fkStarsInMovieStar
  2. foreign key (movieStar) references MovieStar(name)
  3. on delete cascade;
  1. alter table StarsIn add check (
  2. movieYear < (select year(now()) - year(birthdate) from MovieStar where name = starName)
  3. );

或者

  1. alter table StarsIn add check (
  2. starName in (select name from MovieStar where year(birthdate) > movieYear)
  3. );
  1. alter table Studio add constraint studioAddressUnique
  2. unique key (address);
  1. alter table MovieExec add check (
  2. name not in (select name from MovieStar)
  3. );
  1. alter table Studio add check (
  2. name in (select studioName from Movies)
  3. );
  1. alter table Movies add check (
  2. producer not in (select name from MovieExec)
  3. or
  4. (select cert from MovieExec where name = producer)
  5. = studioName
  6. );
  1. create trigger AvgNetWorthDeleteTrigger
  2. after delete on MovieExec
  3. referencing
  4. old tuple as OldTuple
  5. for each row
  6. begin
  7. if (600000 > (select avg(netWorth) from MovieExec)) then
  8. insert into MovieExec
  9. (name, address, cert, netWorth)
  10. values
  11. (OldTuple.name, OldTuple.address, OldTuple.cert, OldTuple.netWorth);
  12. end if;
  13. end
  1. create trigger AvgNetWorthInsertTrigger
  2. after insert on MovieExec
  3. referencing
  4. new tuple as NewTuple
  5. for each row
  6. begin
  7. if (600000 > (select avg(netWorth) from MovieExec)) then
  8. delete from MovieExec where name = NewTuple.name;
  9. --此处应该用主键来定位
  10. end if;
  11. end

7. 视图与索引

虚拟视图

视图更新☆

索引☆

索引的选择☆

物化视图

习题

  1. create trigger insteadInsertDisneyComediesTrigger
  2. instead of insert on DisneyComedies
  3. referencing
  4. new tuple as NewTuple
  5. for each row
  6. begin
  7. insert into Movies
  8. (title, year, length, genre, studioName)
  9. values
  10. (NewTuple.title, NewTuple.year, NewTuple.year, 'comedy', 'Disney');
  11. end
  1. create trigger insteadUpdateDisneyComediesTrigger
  2. instead of update on DisneyComedies
  3. referencing
  4. old tuple as OldTuple
  5. new tuple as NewTuple
  6. for each row
  7. begin
  8. update Movies set length = NewTuple.length
  9. where title = OldTuple.title and year = Oldtuple.year;
  10. end

8. 服务器环境下的SQL

三层体系结构

存储过程(PSM)☆


  1. delimiter //
  2. create procedure test (
  3. in s char(15),
  4. out mean real,
  5. out variance real
  6. )
  7. declare eof condition for sqlstate '02000';
  8. declare MovieCursor cursor for
  9. select length from Movies where studioName = s;
  10. declare newLength interger;
  11. declare movieCount integer;
  12. begin
  13. set mean = 0.0;
  14. set variance = 0.0;
  15. set movieCount = 0;
  16. open MovieCursor;
  17. movieLoop: LOOP
  18. fetch from MovieCursor into newLength;
  19. if eof then leave movieLoop
  20. end if;
  21. set movieCount = movieCount + 1;
  22. set mean = mean + newLength;
  23. set variance = variance + newLength * newLength;
  24. end loop;
  25. set mean = mean / movieCount;
  26. set variance = variance / movieCount - mean * mean;
  27. close MovieCursor;
  28. end//
  29. delimiter ;
  1. delimiter //
  2. create procedure test (
  3. in s char(15),
  4. out mean real,
  5. out variance real
  6. )
  7. declare movieCount integer;
  8. begin
  9. set mean = 0.0;
  10. set variance = 0.0;
  11. set movieCount = 0;
  12. for movieLoop as MovieCursor cursor for
  13. select length from movies where studioName = s;
  14. do
  15. set movieCount = movieCount + 1;
  16. set mean = mean + length;
  17. set variance = variance + length * length;
  18. end for;
  19. set mean = mean / movieCount;
  20. set variance = variance / movieCount - mean * mean;
  21. end//
  22. delimiter ;

JDBC

习题

  1. create procedure solveA (
  2. in studioName char(32),
  3. out netWorth real
  4. )
  5. begin
  6. select sum(netWorth) into netWorth
  7. from MovieExec
  8. where cert = studioName;
  9. end
  1. create function solveB (
  2. name char(32),
  3. address char(64)
  4. ) returns int
  5. declare isMovieStar boolean default false;
  6. declare isMovieExec boolean default false;
  7. begin
  8. if (name, address) in (select name, address from MovieStar) then
  9. set isMovieStar = true;
  10. end if;
  11. if (name, address) in (select name, address from MoveExec) then
  12. set isMovieExec = true;
  13. end if;
  14. if isMovieStar and not isMovieExec then
  15. return 1;
  16. elseif isMovieExec and not isMovieStar then
  17. return 2;
  18. elseif isMovieExec and isMovieStar then
  19. return 3;
  20. else
  21. return 4;
  22. end if;
  23. end
  1. create procedure solveC (
  2. in name char(32),
  3. out longest varchar(64),
  4. out longest2 varchar(64)
  5. )
  6. begin
  7. declare resCursor cursor for
  8. select title from Movies
  9. where studioName = name
  10. order by length desc;
  11. declare eof condition for sqlstate '02000';
  12. open resCursor;
  13. if eof then
  14. set longest = NULL;
  15. set longest2 = NULL;
  16. else
  17. fetch from resCursor into longest;
  18. if eof then
  19. set longest2 = NULL;
  20. else
  21. fetch from resCursor into longest2;
  22. end if;
  23. end if;
  24. close resCursor;
  25. end
  1. create function SolveD (
  2. sname char(32)
  3. ) returns int
  4. declare res int default 0;
  5. begin
  6. select min(year) into res from
  7. Movies inner join StarsIn on title = movieTitle
  8. inner join MovieStar on starName = name
  9. where starName = sname and length > 120;
  10. if isnull(res) then
  11. set res = 0;
  12. end if;
  13. return res;
  14. end
  1. create procedure solveE (
  2. sname char(32)
  3. )
  4. begin
  5. delete from MovieStar where name = sname;
  6. delete from Movies
  7. where title in (
  8. select movieTitle from StarsIn
  9. where starName = sname
  10. );
  11. delete from StarsIn where starName = sname;
  12. end

9. 关系数据库的新课题

SQL中的安全机制和用户认证☆

习题


10. 系统故障对策

可恢复操作的问题和模型

undo日志

redo日志

undo/redo日志

针对介质故障的保护

习题

  1. <START U>
  2. <U, A, 10>
  3. <START T>
  4. <T, B, 20>
  5. <U, C, 30>
  6. <T, D, 40>
  7. <COMMIT T>
  8. <U, E, 50>
  9. <COMMIT U>

11. 并发控制

可串行化

锁实现可串行化

其它锁

习题


a
b
c
d
e
f
g
h
i
j
k

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注