(11)联接查询:查询时先对表进行笛卡尔积操作,然后再做等值联接、选择、投影等操作。联接查询的效率比嵌套查询低。
(12)交互式SQL:在终端交互方式下使用的SQL语言称为交互式SQL。
(13)嵌入式SQL:嵌入在高级语言的程序中使用的SQL语言称为嵌入式SQL。 (14)共享变量:SQL和宿主语言的接口。共享变量有宿主语言程序定义,再用SQL的DECLARE语句说明, SQL语句就可引用这些变量传递数据库信息。 (15)游标:游标是与某一查询结果相联系的符号名,用于把集合操作转换成单记录处理方式。 (16)卷游标:为了克服游标在推进时不能返回的不便,SQL2提供了卷游标技术。卷游标在推进时不但能沿查询结果中元组顺序从头到尾一行行推进,也能一行行返回。
3.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# OM C
WHERE TEACHER=‘LIU’)
NOTICE:有多种写法,比如联接查询写法: SELECT SNAME FROM S,SC,C
WHERE SEX=‘F’ AND SC.S#=S.S# AND SC.C#=C.C#
FR
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'))
3.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
3.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 RE R.B=S.B
3.5 试叙述SQL语言的关系代数特点和元组演算特点。 (P61-62)
3.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
WHE
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
WHERE Y.SNAME='WANG' AND X.S#>Y.S# AND X.AGE (6)检索姓名以WANG打头的所有学生的姓名和年龄。 SELECT SNAME,AGE FROM S WHERE SNAME LIKE 'WANG%' (7)在SC中检索成绩为空值的学生学号和课程号。 SELECT S#,C# FROM SC WHERE GRADE IS NULL (8)求年龄大于女同学平均年龄的男学生姓名和年龄。 SELECT SNAME,AGE FROM S AS X WHERE X.SEX='男' AND X.AGE>(SELECT AVG(AGE) FROM S AS Y WHERE Y.SEX='女') (9)求年龄大于所有女同学年龄的男学生姓名和年龄。 SELECT SNAME,AGE FROM S AS X WHERE X.SEX='男' AND X.AGE>ALL (SELECT AGE FROM S AS Y WHERE Y.SEX='女') 3.7 试用SQL更新语句表达对教学数据库中三个基本表S、SC、C的各个更新操作: (1)往基本表S中插入一个学生元组(‘S9’,‘WU’,18)。