第三章 关系数据库标准语言SQL

第一节 第二节 第三节 第四节

第三节 查 询   (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) [<表名>.]<属性列名表达式>[,[<表名>.]<属性列名表达
式>] …。<属性列名表达式>:由属性列、作用于属性列的集函数和常量的任意算术运算(+,-,*,/)组
成的运算公式。

吉林大学网络教育学院 版权所有