{t|(u)(v)(SC(u)∧SC(v)∧u[1]=v[1]∧u[2]≠v[2])∧t[1]=u[1]} (7)检索全部学生都选修的课程的课程号与课程名。
πC#,CNAME(C(πS#,C#(SC)÷πS#(S))) (涉及到全部值时,应用除法,“除数”是\全部\
{t|(u)(v)(w)(S(u)∧SC(v)∧C(w)∧u[1]=v[1]∧v[2]=w[1]∧t[1]=v[1]∧t[2]=V[2])} (8)检索选修课程包含LIU老师所授课程的学生学号。 πS#(σTEACHER='LIU'(SCC))
{t|(u)(v)(SC(u)∧C(v)∧u[2]=v[1]∧v[3]='LIU'∧t[1]=u[1])}
如果LIU老师有多门课程,则选修课程包含LIU老师所授全部课程的学生学号为: πS#,C#(SC)÷πC#(σTEACHER='LIU'(C)) 4.15
(1)πCNAME,TEACHER(σSEX='女'(SSCC))
(2)优化为:πCNAME,TEACHER(CπC#(πS#,C#(SC)πS#(σSEX='女'(S))))
(基本思路:尽量提前做选择操作;在每个操作后,应做个投影操作,去掉不用的属性值。 4.16
该查询初始的关系代数表达式的语法树 优化后的语法树
4.17 为什么要对关系代数表达式进行优化?
在关系代数运算中,各个运算所费时间和空间是不一样的。如何安排若干关系的运算操作步骤, 直接影响到整个操作所需要的时间和空间。对关系代数表达式进行优化, 可以提高系统的操作效率,达到执行过程即省时间又省空间的目的。
自考数据库系统原理 第五章 SQL语言 课后习题答案 5.1 名词解释
(1)SQL模式:SQL模式是表和授权的静态定义。一个SQL模式定义为基本表的集合。 一个由模式名和模式拥有者的用户名或账号来确定,并包含模式中每一个元素(基本表、视图、索引等)的定义。
(2)SQL数据库:SQL(Structured Query Language),即‘结构式查询语言’,采用英语单词表示和结构式的语法规则。 一个SQL数据库是表的汇集,它用一个或多个SQL模式定义。 (3)基本表:在SQL中,把传统的关系模型中的关系模式称为基本表(Base Table)。 基本表是实际存储在数据库中的表,对应一个关系。
(4)存储文件:在SQL中,把传统的关系模型中的存储模式称为存储文件(Stored File)。 每个存储文件与外部存储器上一个物理文件对应。
(5)视图:在SQL中,把传统的关系模型中的子模式称为视图(View),视图是从若干基本表和(或)其他视图构造出来的表。
(6)行:在SQL中,把传统的关系模型中的元组称为行(row)。 (7)列:在SQL中,把传统的关系模型中的属性称为列(coloumn)。 (8)实表:基本表被称为“实表”,它是实际存放在数据库中的表。
(9)虚表:视图被称为“虚表”,创建一个视图时,只把视图的定义存储在数据词典中,而不存储视图所对应的数据。
(10)相关子查询:在嵌套查询中出现的符合以下特征的子查询:子查询中查询条件依赖于外层查询中的某个值, 所以子查询的处理不只一次,要反复求值,以供外层查询使用。
(11)联接查询:查询时先对表进行笛卡尔积操作,然后再做等值联接、选择、投影等操作。 联接查询的效率比嵌套查询低。
(12)交互式SQL:在终端交互方式下使用的SQL语言称为交互式SQL。
(13)嵌入式SQL:嵌入在高级语言的程序中使用的SQL语言称为嵌入式SQL。
(14)共享变量:SQL和宿主语言的接口。共享变量有宿主语言程序定义,再用SQL的DECLARE语句说明, SQL语句就可引用这些变量传递数据库信息。
(15)游标:游标是与某一查询结果相联系的符号名,用于把集合操作转换成单记录处理方式。
(16)卷游标:为了克服游标在推进时不能返回的不便,SQL2提供了卷游标技术。 卷游标在推进时不但能沿查询结果中元组顺序从头到尾一行行推进,也能一行行返回。 5.2 对于教学数据库的三个基本表 学生 S(S#,SNAME,AGE,SEX) 学习 SC(S#,C#,GRADE) 课程 C(C#,CNAME,TEACHER)
试用SQL的查询语句表达下列查询: (1)检索LIU老师所授课程的课程号和课程名。 SELECT C#,CNAME FROM C
WHERE TEACHER=‘LIU’
(2)检索年龄大于23岁的男学生的学号和姓名。 SELECT S#,SNAME FROM S
WHERE (AGE>23) AND (SEX=‘M’)
(3)检索至少选修LIU老师所授课程中一门课程的女学生姓名。 SELECT SNAME FROM S
WHERE SEX=‘F’ AND S# IN (SELECT S# FROM SC WHERE C# IN (SELECT C# FROM C
WHERE TEACHER=‘LIU’)
NOTICE:有多种写法,比如联接查询写法: SELECT SNAME FROM S,SC,C
WHERE SEX=‘F’ AND SC.S#=S.S# AND SC.C#=C.C#
AND TEACHER='LIU' 但上一种写法更好一些。
(4)检索WANG同学不学的课程的课程号。 SELECT C# FROM C
WHERE C# NOT IN (SELECT C# FROM SC WHERE S# IN (SELECT S# FROM S
WHERE SNAME='WANG'))
(5)检索至少选修两门课程的学生学号。 SELECT DISTINCT X.SNO FROM SC X,SC Y
WHERE X.SNO=Y.SNO AND X.CNO<>Y.CNO
Notice:对表SC进行自连接,X,Y是SC的两个别名。 (6)检索全部学生都选修的课程的课程号与课程名。 SELECT C#,CNAME FROM C
WHERE NOT EXISTS (SELECT * FROM S
WHERE S# NOT IN (SELECT * FROM SC
WHERE SC.C#=C.C#))
要从语义上分解:(1)选择课程的课程号与课程名,不存在不选这门课的同学。 其中,“不选这门课的同学”可以表示为: SELECT * FROM S
WHERE S# NOT IN (SELECT * FROM SC
WHERE SC.C#=C.C#)
或者SELECT * FROM S
WHERE NOT EXISTS (SELECT * FROM SC
WHERE S.S#=C.S# AND SC.C#=C.C# )
(7)检索选修课程包含LIU老师所授课的学生学号。 SELECT DISTINCT S# FROM SC WHERE C# IN (SELECT C# FROM C
WHERE TEACHER='LIU'))
5.3 设有两个基本表R(A,B,C)和S(D,E,F),试用SQL查询语句表达下列关系代数表达式: (1)πA(R) (2)σB='17'(R) (3)R×S (4))πA,F(σC=D(R×S)) (1)SELECT A FROM R
(2)SELECT * FROM R WHERE B='17' (3)SELECT A,B,C,D,E,F FROM R,S
(4)SELECT A,F FROM R,S WHERE R.C=S.D
5.4 3.4 设有两个基本表R(A,B,C)和S(A,B,C)试用SQL查询语句表达下列关系代数表达式: (1)R∪S (2)R∩S (3)R-S (4)πA,B(R)πB,C(S) (1)SELECT A,B,C FROM R UNION
SELECT A,B,C FROM S
(2)SELECT A,B,C FROM R INTERSECT SELECT A,B,C FROM S
(3)SELECT A,B,C FROM R
WHERE NOT EXISTS (SELECT A,B,C FROM S
WHERE R.A=S.A AND R.B=S.B AND R.C=S.C) (4)SELECT R.A,R.B,S.C FROM R,S
WHERE R.B=S.B
5.5 试叙述SQL语言的关系代数特点和元组演算特点。 (P61-62)
5.6 试用SQL查询语句表达下列对教学数据库中三个基本表S、SC、C的查询: (1)统计有学生选修的课程门数。
SELECT COUNT(DISTINCT C#) FROM SC (2)求选修C4课程的学生的平均年龄。 SELECT AVG(AGE) FROM S
WHERE S# IN (SELECT S# FROM SC
WHERE C#='C4') 或者, SELECT AVG(AGE) FROM S,SC
WHERE S.S#=SC.S# AND C#='004'
(3)求LIU老师所授课程的每门课程的学生平均成绩。 SELECT CNAME,AVG(GRADE) FROM SC ,C
WHERE SC.C#=C.C# AND TEACHER='LIU' GROUP BY C#
(4)统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,按人数降序排列,若人数相同,按课程号升序排列。 SELECT DISTINCT C#,COUNT(S#) FROM SC GROUP BY C#
HAVING COUNT(S#)>10 ORDER BY 2 DESC, C# ASC
(5)检索学号比WANG同学大,而年龄比他小的学生姓名。 SELECT X.SNAME
FROM S AS X, S AS Y