文档详情

数据库系统概论-第四版chp3-2.ppt

发布:2016-12-27约1.68万字共79页下载文档
文本预览下载声明
带有EXISTS谓词的子查询(续) 不同形式的查询间的替换 一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换 所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换 用EXISTS/NOT EXISTS实现全称量词(难点) SQL语言中没有全称量词? (For all) 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词: (?x)P ≡ ? (? x(? P)) An Introduction to Database System 带有EXISTS谓词的子查询(续) 例:[例39]查询与“刘晨”在同一个系学习的学生。 可以用带EXISTS谓词的子查询替换: SELECT Sno,Sname,Sdept FROM Student S1 WHERE EXISTS   (SELECT * FROM Student S2 WHERE S2.Sdept = S1.Sdept AND S2.Sname = ‘刘晨’); An Introduction to Database System 带有EXISTS谓词的子查询(续) [例46] 查询选修了全部课程的学生姓名。 SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM Course WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno ) ); An Introduction to Database System 带有EXISTS谓词的子查询(续) 用EXISTS/NOT EXISTS实现逻辑蕴函(难点) SQL语言中没有蕴函(Implication)逻辑运算 可以利用谓词演算将逻辑蕴函谓词等价转换为: p ? q ≡ ? p∨q An Introduction to Database System 带有EXISTS谓词的子查询(续) [例47]查询至少选修了学生200215122选修的全部课程的学生号码。 解题思路: 用逻辑蕴函表达:查询学号为x的学生,对所有的课程y,只要200215122学生选修了课程y,则x也选修了y。 形式化表示: 用P表示谓词 “学生200215122选修了课程y” 用q表示谓词 “学生x选修了课程y” 则上述查询为: (?y) p ? q An Introduction to Database System 带有EXISTS谓词的子查询(续) 等价变换: (?y)p ? q ≡ ? (?y (?(p ? q )) ≡ ? (?y (?(? p∨ q) )) ≡ ? ?y(p∧?q) 变换后语义:不存在这样的课程y,学生200215122选修了y,而学生x没有选。 An Introduction to Database System 带有EXISTS谓词的子查询(续)? 用NOT EXISTS谓词表示: SELECT DISTINCT Sno FROM SC SCX WHERE NOT EXISTS (SELECT * FROM SC SCY WHERE SCY.Sno = 200215122 AND
显示全部
相似文档