第三节 查 询 (1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)
[例] 查询所有选修了1号课程的学生姓名。用嵌套查询:
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC /*相关子查询*/
WHERE Sno=Student.Sno AND Cno= ' 1 ');
求解过程用连接运算:
SELECT Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno AND
SC.Cno= '1';
3. 不同形式的查询间的替换
一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换。所有带IN谓词、比较运算
符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。
5.用EXISTS/NOT EXISTS实现全称量词(难点)
SQL语言中没有全称量词? (For all),可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:
(∨x)P ≡ ┐ (x(┐P))
6. 用EXISTS/NOT EXISTS实现逻辑蕴函(难点)
SQL语言中没有蕴函(Implication)逻辑运算,可以利用谓词演算将逻辑蕴函谓词等价转换为:
p→q ≡┐p∨q
等价变换:
(∨y)p→q ≡┐(y (┐(p→q ))
≡┐(y (┐(┐p∨ q)
≡┐y(p∧┐q)
变换后语义:不存在这样的课程y,学生95002选修了y,而学生x没有选。用NOT EXISTS谓词表示:
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
(SELECT *
FROM SC SCY
WHERE SCY.Sno = ' 95002 ' AND
NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND
SCZ.Cno=SCY.Cno));
3.3.5 集合查询
标准SQL直接支持的集合操作种类:并操作(UNION)。
一般商用数据库支持的集合操作种类:并操作(UNION);交操作(INTERSECT);差操作(MINUS)。
1. 并操作
形式:<查询块>;UNION:<查询块>。参加UNION操作的各结果表的列数必须相同;对应项的数据类型也
必须相同。
2. 交操作
标准SQL中没有提供集合交操作,但可用其他方法间接实现。
3. 差操作
标准SQL中没有提供集合差操作,但可用其他方法间接实现。
4. 对集合操作结果的排序
ORDER BY子句只能用于对最终查询结果排序,不能对中间结果排序。任何情况下,ORDER BY子句只能出
现在最后。对集合操作结果排序时,ORDER BY子句中用数字指定排序属性。
3.3.6 SELECT语句的一般格式
SELECT [ALL|DISTINCT]
<目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
FROM <表名或视图名> [别名]
[ ,<表名或视图名> [别名]] …
[WHERE <条件表达式>]
[GROUP BY <列名1>[,<列名1’>] ...
[HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]
[,<列名2’> [ASC|DESC] ] … ];
目标列表达式格式:(1) [ <表名>.] *;(2) [<表名>.]<属性列名表达式>[,[<表名>.]<属性列名表达
式>] …。<属性列名表达式>:由属性列、作用于属性列的集函数和常量的任意算术运算(+,-,*,/)组
成的运算公式。
|