阅读下列说明和E-R图,回答问题1至问题3,将解答填入对应栏内。
[说明]
设有下列关于学生成绩管理系统的E-R图(见图2-1)。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体间的联系。假定已通过下列SQL语言建立了基本表:
CREATE TABLE STUDENT(SNo CHAR(6)NOT NULL UNIQUE,
SName CHAR(20),
Sex CHAR(1),
Dept CHAR(20),
Age SMALLINT);
CREATE TABLE COURSE(CNo CHAR(6)NOT NULL UNIQUE,
CName CHAR(20),
Hour SMALLINT,
Credit SMALLINT);
CREATE TABLE SC (SNo CHAR(6),
CNo CHAR(6),
GRADE SMALLINT,
PRIMARY KEY (SNo,CNo));
为了答题的方便,图中的实体和属性同时给出了中英文两种名字,回答问题时只须写出英文名即可。
填充下列SQL程序5.1~5.4中的(1)~(6),使它们分别完成以下查询功能:
程序5.1:检索选修所有课程的学生姓名。
程序5.2:给出全体学生人数。
程序5.3:按学号给出每个学生的平均成绩。
程序5.4:按学号给出每个学生选修课程的门数。
[程序5.1]
SELECT SName FROM STUDENT WHERE (1)
(SELECT FROM COURSE WHERE (2)
(SELECT * FROM SC WHERE (3) ))
[程序5.2]
SELECT (4) FROM STUDENT
[程序5.3]
SELECT (5) FROM SC GROUP BY SNO
[程序5.4]
SELECT (6) FROM SC GROUP BY SNO
(6)处填()。
参考答案:SNO,COUNT(CNO)
解析:
本题主要是考察SQL。SQL中数据查询是最常用的,其完整形式如下: SELECT [ALL | DISTINCT]<目标列表达式>[,<目标列表达式>]… FROM <表名或视图名>[,<表名或视图名>] [WHERE <条件表达式>] [GROUP BY<列名1>[HAVING<条件表达式>]] [ORDER BY<列名2>[ASC | DESC]…] 子句顺序为SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY,但SELECT和FROM是必须的,HAVING子句只能与GROUP BY搭配起来使用。 该成绩管理系统的关系模式有:STUDENT(SNo,SName,Sex,Dept,Age),主键为SNo,COURSE(CNo,CName,Hour,Credit),主键为CNo,SC(SNO,CNO,GRADE),主键为(Sno,CNo)。 程序5.1是检索选修所有课程的学生姓名,亦即“不存在没有选修的课程”。空(1)是引出子查询的,该类连接词有:IN、NOT IN、EXISTS、NOT EXISTS,EXISTS引出的子查询一般是SELECT*型,故排除IN型;再据语意分析应填NOT EXISTS。空(2)同理得应填NOT EXISTS。空(3)是“真正”的查询条件,该查询涉及到三个表STUDENT、COURSE、CS,故应填STUDENT.SNO=SC.SNO ANDCOURSE.CNO=SC.CNO。 程序5.2是给出全体学生人数,涉及集函数的应用。常用的集函数有:COUNT、SUM、AVG、MAX、MIN。在此用到COUNT,故空(4)应填COUNT(*)。 程序5.3是按学号给出每个学生的平均成绩,同样是集函数,AVG的应用。要注意的是需要同时给出学号,故空(5)应填:SNO,AVG(GRADE)。 程序5.4是按学号给出每个学生选修课程的门数,属COUNT的用法,并注意同时给出学号。故空(6)应填:SNO,COUNT(CNO)。