有下列关于运动会管理系统的ER图,如图10所示。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体之间的关系。假定已通过下列SQL语言建立了基本表。 CREATE TABLE ATHLETE ANAME CHAR(20), ASEX CHAR(1), ATEAM CHAR(20)); CREATE TABLE |TEM (INO CHAR(6)NOT NULL, INAME CHAR(20), ITIME CHAR(12), IPLACE CHAR(20); CREATE TABLE GAMES (ANO CHAR(6)NOTNULL, INO CHAR(6)NOT NULL, SCORRE CHAR(10)); 为了答题的方便,图中的实体和属性同时给出了中英文两种文字,回答问题时只需写出英文名即可。 【E-R图】
【问题】 填充下列SQL程序1~4中的(1)~(7),使它们分别完成相应的功能: 程序1:统计参加比赛时男运动员人数。 SELECT (1) FROM ATHLETE WHERE ASEX=’M’; 程序2:查100872号运动员参加的所有项目及其比赛时间和地点。 SELECT ITEM,INO,IN A ME,ITIME,IPLACE FROM GAMES,ITEM WHERE (2) ; AND (3) ; 程序3:查参加100035项目的所有运动员名单。 SELECT ANO,ANAME,ATEAM FROM ATHLETE WHERE (4) ; (SELECT (4) (5) FROM GAMES WHERE GAMES ANO=ATHLETE.ANO AND INO=’100035’); 程序4:建立运动员成绩视图。 (6) ATHLETE-SCORE AS SELECT ATHLETE,ANO,ANAME,ATEAM,INAME,SCORE FORM (7) WHERE ATHLETE.ANO=GAMES. ANO AND GAMES.INO=ITEM.INO;
参考答案:
解析:(1)COUNT(*)(若答COUNT或COUNT,得2分) (2)GAMES.INO=IFEM.INO (3)GAMES.ANO=‘100872’(注:(2)、(3)可互换、无前缀得1分) (4)EXISTS (5)*或ANO或INO或SCORE或后3个列名的任意组合 (6)CREATEVIEW (7)ATHLETE,ITEM,GAMES(3项可交换。) 注:(4)、(5)也可为 (4)ANOIN (5)ANO 本题是关于系数据库标准语言——SQL(Structured Query Language)语言的题目,由题目中给出的ER图可知3个表中,ATH- LETE和ITEM是基本表,表ATHETE的主键是运动员编号ANO,表I-TEM的主键是项目编号INO,表GAMES是一个视图,以ANO、INO为外键。 程序1统计参加比赛的男运动员人数,也就是表ATHLETE中, AEX=’M’的记录的个数,所以要用到库函数COUNT(*)。这里要注意的是COUNT与COUNT(*)区别,COUNT的功能是对一列中的值计算个数,而COUNT(*)才是计算数据库中记录的个数。所以填空①的答案为“COUNT(*)”。 程序的2统计100872号运动员参加的所有项目及比赛时间和地点,所以SELECT后面的内容是项目编号ITEM.INO、项目名称INAME时间ITIME及地点IPLACE。统计涉及比赛表GAMES和项目表ITEM,所以FROM后面的内容为GAMES、ITEM。本题考的是连接查询,所谓连接查询指的是涉及两个以上的表的查询。由于是统计100872号运动员参加的所有项目及比赛时间和地点,所以查询条件中必然有 GAMES.INO=’100872’(程序中引用到字段时,若字段名在各个表中是惟一的,则可以把字段名前的表名去掉,否则,应当加上表名作为前缀,以免引起混淆)。由于GAMES表中只有比赛的成绩,那些关于项目的数据必须从项目表ITEM中取得,所以还应该有两个表之间的关联,即 GAMES.INO=TYEM.INO。所以填空②和③可交换,不影响查询结果。 程序3要求查参加100035项目的所有运动员名单。分析查询表达式,必首先查询GAMES表,找出参加100035项目的那些运动员的编号ANO,即GAMES.ANO=ATHLETE.ANO AND INO=’100035’,然后再根据查询到的运动员号ANO从ATHLETE表中抽取运动员的数据。所以填空④的答案为“EXISTS”或“ANOIN”,填空⑤的答案为“ANO”。 程序4要求建立运动员成绩视图。建立视图的命令为CREATE- VIEW,所以填空⑥的答案一定是“CREATEVIEW”。建立的是运动员成绩视图,那么一定涉及运动员情况、运动员参加的项情况和该项目的成绩,所以要用到ATHLETE、ITEM和GAMES这3个表,因此FROM子句后为ATHLETE、GAMES、ITEM,3个表可以是任意次序,不影响结果。