关系数据库语言SQL课后练习题(一)

前言:
部分过于简单的题目只给出答案,无解析。


一、题干:

设教学数据库中有4个关系:
教师关系 T(T#,TNAME,TITLE)
课程关系C(C#,CNAME,T#)
学生关系S(S#,SNAME,AGE,SEX)
选课关系 SC(S#,C#,SCORE)
试用SQL查询语句表示下列查询。

二、题解

2.1 检索年龄小于17岁的女学生的学号和姓名。

SQL代码如下(示例):

SELECT S#, SNAME
FROM S
WHERE AGE<17 AND SEX=’F’;

2.2 检索男学生所学课程的课程号和课程名。

代码如下(示例):

SELECT C.C#, CNAME (连接查询方式)
FROM S,SC,C
WHERE S.S#=SC.S# AND SC.C# = C.C# AND SEX=’M’;

2.3 检索男学生所学课程的任课老师的工号和姓名

SELECT T.T#, TNAME
FROM S,SC,C,T
WHERE S.S# = SC.S# AND SC.C# = C.C# AND C.T#=T.T# AND SEX = ’M’;

2.4 检索至少选修两门课程的学生学号

SELECT DISTINCT X.S#
FROM SC AS X, SC AS Y
WHERE X.S#=Y.S# AND X.C# != Y.C#;

2.5 检索至少有学号为S2和s4的学生选修的课程的课程号。

SELECT DISTINCT X.C#
FROM SC AS X, SC AS Y
WHERE X.S#=’S2’ AND Y.S# = ’S4’ AND X.C# = Y.C#;

2.6 检索WANG同学不学的课程的课程号.

SELECT C#
FROM C
WHERE NOT EXISTS
(SELECT*
FROMS.SC
WHERE S.S#=SC.S#AND SC.C#=C.C# AND SNAME=’WANG’);

2.7 检索全部学生都选修的课程的课程号与课程名。

SELECT C#,CNAME
FROM C
WHERE NOT EXISTS
(SELECT *
FROM S
WHERE NOT EXISTS
(SELECT*
FROM SC
WHERE S#=S.S#AND C#=C.C#));

2.8 检索选修课程包含LIU老师所授全部课程的学生学号。

方法一:

SELECT DISTINCT S#
FROM SC AS X
WHERE NOT EXISTS
(SELECT*
FROM C,T
WHERE C.T#=T.T#AND TNAME=’LIU’
AND NOT EXISTS
(SELECT{
    
    
FROM SC AS Y
WHERE Y.S#=X.S# AND Y.C#=C.C#))

方法二:

SELECT DISTINCT S#
FROM SC X
WHERE NOT EXISTS
((SELECT C# FROM C,T
WHERE C.T#=T.T# AND TNAME='LIU’)
EXCEPT
(SELECT C# FROM SC Y WHERE Y.S#=X.#))

三、总结

本大题较为基础,需要注意的是:

  1. SQL和关系语句的差异性。如在做自身笛卡尔积的时候,通常把第一个table写成A as X, 第二个table写成A as Y,如此再在where中添加条件就不会产生二义性了。
  2. 对于关系语句中除法的表达,SQL采用双重否定表肯定,如第七小题。读者只需明白双重否定整体的含义,无需纠结每一句的执行过程。这也是SQL区别于过程性编程语言的一个特点。

猜你喜欢

转载自blog.csdn.net/Skylar_tramp/article/details/114745266