Speech 08 SQL语言完整性和安全性
约束
Trigger(O, P, A, R)
安全性
关于exist的4个讨论
not exists的运用:
- 选出一个不存在,或一个存在;
- 判断包含于(与except配合)
Note: exists 仅仅表示存在一个元组使其满足.它不适用于判断所有分组都满足(比如所有人的年龄都等于18)
For example
已知:
Student(S#, Sname, Ssex, Sage, D#, Sclass)
Course(C#, Cname, Chour, Credit, T#)
SC(S#, C#, Sgrade)
Teacher(T#, Tname, D#, Salary)
- 学过“李明”老师讲授课程的所有学生 . …1.1
等价于 不存在对于"李明"老师讲授的所有课程都没有学过 …1.2
1.2不能用not exists写出来,因为它对任意的去做判断
Select *
From Student S
Where exists(select * From Course C, SC, Teacher T
where(S.S# = SC.S# and C.C# = SC.C# and C.T# = T.T#
and T.Tname = '李明'))
- 找出学全了李明老师讲授所有课程的同学
法一:等价于 不存在 有一门’李明’老师讲授的课程有同学没有学过
select *
From Student S
where not exists(select * From Course C, Teacher T //不存在
WHERE(T.Tname = '李明' and C.T# = T.T# //有一门'李明'老师教授的课程
and not exists(select * From SC //有学生没学过
where(SC.C# = C.C# and SC.S# = S.S#))))
…\…\法二:A 属于B <==> not exists ( A except B)
A:'李明’教授的课 属于 B:学生学过’李明’老师讲授的课
select *
From Student S /* A:'李明'教授的课 属于 B:学生学过'李明'老师讲授的课 equal to 不存在 属于A,但是不属于B*/
where not exists(Select C.C# From Course C, Teacher T
WHERE(T.Tname = '李明' and C.T# = T.T# )/* A:'李明'教授的课 */
Except (select C.C# From SC, Course C, Teacher T
where(C.T# = T.T# and T.Tname = '李明' and S.S# = SC.S# and SC.C# = C.C# )));
- 找出没学过李明老师讲授课程的同学
等价于 不存在 有一门’李明’老师讲授的课程有同学学过
select *
From Student S
where not exists(Select * From Course C, Teacher T /* 不存在 */
WHERE(T.Tname = '李明' and C.T# = T.T# /* 有一门'李明'老师教授的课程 */
and exists(select * From SC /* 有同学学过 */
where(SC.C# = C.C# and SC.S# = S.S#))));
- 找出没学全李明老师讲授课程的学生
…法一: 等价于 存在 一门李明老师讲授的课程有学生都没学过
select *
From Student S
where exists(Select * From Course C, Teacher T /* 存在 */
WHERE(T.Tname = '李明' and C.T# = T.T# /* 有一门'李明'老师教授的课程 */
and not exists(select * From SC /* 同学没学过 */
where(SC.C# = C.C# and SC.S# = S.S#))));
…\…\法二:利用学生所学的课程 对称差 李明老师所教的课程 不为空 ==>没学全
select *
From Student S
where exists( (Select C.C# From SC, Course C, Teacher T /* 对称差不等于空 */
WHERE(S.S# = SC.S# and SC.C# = C.C# /* 学生所学'李明'教授的课记录 */
and T.Tname = '李明' and C.T# = T.T# )
Except (select C.C# From Course C, Teacher T /* '李明'老师教授的所有课 */
where(C.T# = T.T# and T.Tname = '李明')))
Union (select C.C# From Course C, Teacher T
where(C.T# = T.T# and T.Tname = '李明')
Except Select C.C# From SC, Course C, Teacher T
WHERE(S.S# = SC.S# and SC.C# = C.C#
and T.Tname = '李明' and C.T# = T.T# )));
p.s.4.的法二改编于另一名同学的MOOC评论
嵌入式语言交互过程中错误捕获的作用域
exec sql wheneve …只表示从当前到往后同一条exec sql whenever 之间,并不随着语句的控制流(如goto)跳到另外的地方.作用域仅仅在这两条语句之间.
exec sql whenever condition action -+
i1: |
i2: goto end | 作用域范围
i3: |
... |
exec sql whenever condition action -+
in:
in+1:
end:
in+2:
in+3:
事务transaction
简称ACID
- Atomicity原子性:对于事务里所有操作,要么全部都做,要么全部都不做
- Consistency一致性:保持事务的状态是正确的
- Isonation隔离性:数据库中的事务 T1,T2;就算T1,T2是并发的,但他们的效果仍是一个先做,另一个后做
- Durabiliy:DB已提交的事务的影响是永久的,被撤销的事务的影响是可以恢复的