问答题 阅读以下说明,回答下面问题。
[说明]
某宾馆需要建立一个住房管理系统,部分的需求分析结果如下。
(1)一个房间有多个床位,同一房间内的床位具有相同的收费标准。不同房间的床位收费标准可能不同。
(2)每个房间有房间号(如201、202等)、收费标准、床位数目等信息。
(3)每位客人有身份证号码、姓名、性别、出生日期和地址等信息。
(4)对每位客人的每次住宿,应该记录其入住日期、退房日期和预付款额信息。
(5)管理系统可查询出客人所住房间号。
根据以上的需求分析结果,设计一种关系模型如图所示。
问答题 根据上述说明和实体联系图,得到该住房管理系统的关系模式如下所示,请补充住宿关系。
房间(房间号,收费标准,床位数目)
客人(身份证号,姓名,性别,出生日期,地址)
住宿(______,入住日期,退房日期,预付款额)
【正确答案】
【答案解析】房间号,身份证号 此题考查的知识点包括:主键与外键的概念、SQL语言及索引相关知识。难点在于第4问的索引相关知识考查。
首先看第1问。此题要求补充住宿关系。我们从“住房管理系统的实体联系图”可以明显看出,住宿关系是从实体联系图中的联系“住宿”转换而来的,此联系是一个多对多的联系。若将多对多的联系转为关系,则关系中应有联系的所有属性,以及与联系相关的所有实体的主键。现在的住宿关系中己包含联系的所有属性,只缺客人关系的主键:身份证号,以及房间关系的主键:房间号。所以第1问的答案为:房间号,身份证号。
接下来看第2问。由阅卷情况来看,此题出错概率较高。很多考生误将主键定为:(房间号,身份证号),这是错误的。其实题目中有两个地方非常明确地给了考生提示。
其一,实体联系图中房间与客人之间的关系是多对多,这也就意味着在住宿关系中,一个身份证号可以对应多个房间号,一个人有必要同时住多个房间吗?显然不需要,所以多个房间情况的产生是因为多次入住。那么一个人多次入住同一房间的可能性是有的,这就有可能产生多条记录的(房间号,身份证号)值相同,所以它不能成为主键,只有加上入住日期才能成为主键。此外,在住宿关系中,房间号和身份证号都不是住宿关系的主键,但它们分别是房间关系和客人关系的主键,它们对于住宿关系来说,是外键。所以此题答案为主键:房间号,身份证号,入住日期;外键为:房间号,身份证号。
其二,在第3问中提及“住宿次数大于5次的客人”,这也表明住宿关系中(房间号,身份证号)值相同是有可能的。
接下来看第3问。此题涉及的都是简单SQL语句。首先,第2位置在填入SQL进行查询时,以什么关键字来进行分组,由于SQL语句前段部分有“Select住宿.身份证号,count(入住日期)”,同时我们知道在分组SQL中,结果集的字段只能有两种情况:一是分组关键字,二是聚合函数。count(入住日期)属于聚合函数,剩下的住宿.身份证号只能是:分组关键字,否则SQL非法。所以第2空应填入:住宿.身份证号。第3位置是填入一个条件关键字,因为题目要求SQL找出“住宿次数大于5次的客人”,那么是不是填入Where子句呢?不是,应是Having。这两者的区别在于,Having后面的条件是当分组结束以后,再进行判别的;而Where是在分组之前进行判别的,在分组之前对于每一条记录的count(入住日期)值必定是1,这样的条件是毫无意义的。所以第3空处应填:Having。第4位置需要完成的是“按照入住次数进行降序排列”功能。此功能可以用Order by count(入住日期)Desc子句来完成,也可以用Order by 2 Desc来完成,其中的Desc表示按降序排列,若要按升序排列,可将其替换为ASC或直接去除Desc关键字,因为Order子句默认按升序排列。
最后看第4问。解答此问要求了解一定的索引知识。
索引是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅全书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。在书籍中,索引就是内容和相应页号的清单;在数据库中,索引就是表中数据和相应存储位置的列表。索引可以大大减少数据库管理系统查找数据的时间。
索引的优点如下。
(1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
(2)可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
(3)可以加速表和表之间的连接,特别是在实现数据的参照完整性方面特别有意义。
(4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
(5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点如下。
(1)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
(2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
(3)当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。
索引的类型如下。
根据索引的顺序与数据表的物理顺序是否相同,可以把索引分成两种类型。一种是数据表的物理顺序与索引顺序相同的聚簇索引(一个表只能建一个聚簇索引);另一种是数据表的物理顺序与索引顺序不相同的非聚簇索引(一个表最多能建249个非聚簇索引)。
了解了索引相关的概念以后,下面开始解题。第3题的SQL涉及查询的字段有:身份证号和入住日期。根据索引的相关性质可知,只有身份证号和入住日期有建立索引的必要,其余的字段不适合建索引。又因为题目要求“除主键和外键外”,所以“身份证号”字段应排除,现只有“入住日期”需要建索引。在索引中,聚簇索引适宜建单索引,而非聚簇索引适宜建多索引,所以此处建聚簇索引比较合适。当对“入住日期”建立聚簇索引后,可大大提高SQL语句的查询速度。
问答题 请给出第1问中住宿关系的主键和外键。
【正确答案】
【答案解析】住宿主键:房间号,身份证号,入住日期
住宿外键:房间号,身份证号
问答题 若将上述各关系直接实现为对应的物理表,现需查询在2005年1月1日到2005年12月31日期间,在该宾馆住宿次数大于5次的客人身份证号,并且按照入住次数进行降序排列。下面是实现该功能的SQL语句,请填补语句中的空缺。
SELECT住宿.身份证号,count (入住日期)
FROM住宿,客人
WHERE入住日期>="20050101"AND入住日期<="20051231"
AND住宿.身份证号=客人.身份证号
GROUP BY______
______count(入住日期)>5
______
【正确答案】
【答案解析】住宿.身份证号
Having
ORDER BY count(入住日期)DESC或ORDER BY 2 DSC或ORDER BY 2 DESC
问答题 为加快SQL语句的执行效率,可在相应的表上创建索引。根据第3题中的SQL语句,除主键和外键外,还需要在哪个表的哪些属性上创建索引,应该创建什么类型的索引,请说明原因。
【正确答案】
【答案解析】表:住宿
属性:入住日期
类型:聚簇索引,或聚集索引,或cluster
原因:表中记录的物理顺序与索引项的顺序一致,根据索引访问数据时,一次读取操作可以获取多条记录数据,因而可减少查询时间。