2022-2023-1期中¶
一、选择题(共45分,每题3分)¶
-
一张存储学生信息的关系表 student 包含 name、age、date 三个属性。如果要减少查询
Select age From student Where name='XXXX'的耗时,应该怎样创建索引? ( ) A. 在 age 上创建索引 B. 在 name 上创建索引 C. 在 age, name 上创建索引 D. 不创建索引 -
employee 为储存在 mongodb 中的一个文档集合,包含了一个整数型属性 salary。要查找工资最高的5位员工,在python中应该使用哪个查询语句? ( ) A.
employee.find().sort('salary',-1).limit(5)B.employee.find().sort('salary', pymongo.ASCENDING).limit(5)C.employee.find().sort({ "salary":-1})D.employee.find().sort('salary',-1).skip(5) -
market 为一个存放物品名称和特征的文档集合,其结构为{pno, pname, color, weight}, 包含了以下形态的文档数据。 {P2, 螺栓, 绿, 17} {P3, 螺丝刀, 蓝, 14} {P4, 凸轮, 蓝, 40} {P5, 螺丝刀, 蓝, 14} 请问,下面哪个指令不能满足查询需求? ( ) A. 得到物品颜色的种类:
market.distinct('color')B. 得到不同颜色物品的总重量:market.aggregate([{'$group': {'_id':'color', 'totalWeight': {'$sum':'$weight'}}}])C. 得到蓝色的物品名称:market.find({'color':'蓝'}, {'pname': 1})D. 将凸轮和齿轮的颜色改为红色:market.update_one({'pname': {"$or":["凸轮", "齿轮"]}},{'$set': {'color':'红'}}) -
mongoDB 中的学生集合 schema 如下 {'id': ObjectId('633127d821b064d53074edbf'), 'name': 'Joe', 'gender': 'm', 'age': 23, 'birthdate': {'day': 15, 'month': 3, 'year': 1997}, 'hobby': ['football', 'basketball', 'reading'], 'city': 'Beijing', 'time': [9, 18]} 找出其中喜欢'violin'的人数,用python实现如下
match = {'$match': {'hobby': {'___': ['violin']}}}
project = {'$project': {'count': 1}}
group = {'$group': {'_id': 'like_violin', 'count': {'___': 1}}}
result = users_col.aggregate([match, group, project])
for each in result:
print(each)
___处应该分别填( )。
A. $contain, $sum
B. $in, $sum
C. $in, $count
D. $contain, $count
- 对于以下SQL查询
Select B.c, Count(*)
From A Inner Join B on A.a = B.b
Where A.c > B.c
Group By B.d
Having Count(*) > 10;
其中用于条件筛选的字段 on, where, having 的执行顺序是( )。 A. on > where > having B. on > having > where C. Where > on > having D. Where > having > on
-
现有两张无任何约束的表A(a1, a2, a3), B(b1, b2, b3)。执行SQL查询“
Select A.*, B.* From A Left Join B on A.a1 = B.b1”得到表S,那么A表的记录数m和S表的记录数n的大小关系是( ) A. m = n B. m >= n C. m < n D. m <= n -
现有两张表 S(Sno, Sname, City) 和 SPJ(Sno, Pno, Jno, QTY),查询上海的所有供应商每笔订单的平均 QTY 数量 SQL语句如下:
With S1 as (Select Distinct Sno From S Where City = '上海')
Select Sno, AVG(qty) as avg_qty
From SPJ
Where Sno in ___
___ Sno;
两处_的正确填充内容分别是( )。 A. S1 和 Group by B. S1 和 Order by C. (select Sno from S1) 和 Group by D. (select * from S1) 和 Order by
- 对下述 SQL语句,四个选项中正确且执行性能最优的关系代数表达式是( )
Select P.Pname, P.weight
From P, SPJ
Where P.Pno=SPJ.Pno
and P.weight > 300
and SPJ.Jno in
(Select J.Jno
From J
Where J.City = '上海');
A. \(\prod_{P.Pname, P.weight}(\sigma_{weight>300}(P) \Join _{P.Pno=SPJ.Pno} SPJ \Join_{SPJ.Jno=J.Jno} \sigma_{City='上海'}(J))\)
B.\(\prod_{P.Pname, P.weight}(\sigma_{weight>300}(P \Join _{P.Pno=SPJ.Pno} SPJ \Join_{SPJ.Jno=J.Jno} \sigma_{City='上海'}(J)))\)
C.\(\prod_{P.Pname, P.weight}(\sigma_{weight>300 \cup City='上海'}(P \Join _{P.Pno=SPJ.Pno} SPJ \Join_{SPJ.Jno=J.Jno} J))\)
D.\(\prod_{P.Pname, P.weight}(\prod_{P.Pname, P.weight}(\sigma_{weight>300}(P)) \Join_{P.Pno=SPJ.Pno} SPJ \Join_{SPJ.Jno=J.Jno}\sigma_{City='上海'}(J) )\)
-
以下关于关系代数的说法中,哪一项不正确?( ) A. 关系代数表达式的操作对象是关系 B. 关系代数表达式的运算结果是关系 C. 一个关系经过投影操作后,元组个数不会减少 D. 一个关系经过选择操作后,元组个数不会增加
-
以下哪个关系操作的计算复杂度最低?( ) A. 选择 B. 投影 C. 连接 D. 聚集
-
数据库的查询处理过程不包括以下哪个步骤?( ) A. 查询分析 B. 查询优化 C. 查询物理优化 D. 查询结果检查
-
以下哪种场景对索引的使用是合理的?( ) A. 在只有20行的小表上建索引 B. 在经常被更新的属性上建索引 C. A 属性经常被作为查询条件,在复合属性AB上建索引 D. 在取值范围很小的属性(比如“男/女”)上建索引
-
对于数据库管理系统使用的数据模型,关系模型相对于网状模型和层次模型的优势不包括( ) A. 具备更好的数据访问性能 B. 使用声明式的数据访问语言,让查询变得更简洁 C. 更好地实现应用程序设计和数据库设计之间的分离 D. 进一步减轻数据管理对于应用程序开发者的负担
-
对于关系表R(a, b, c, d),如果在属性a上创建一个B树索引,那么以下哪个查询无法从该索引获得收益?( ) A. SELECT a, b, c FROM R WHERE a=100; B. SELECT a, b, c FROM R WHERE a>1000 OR a<20; C. SELECT a, b, c FROM R WHERE a>1000 AND b <20; D. SELECT a, b, c FROM R WHERE a=100 OR b=20;
-
假设两张表A和B分别包含20,000个元组和100,000个元组,硬盘上的一页可存储40个元组,而内存可以容纳2,000个元组,两表的连接属性上都有创建索引。如果要连接A和B,使用哪种算法最划算?( ) A. 嵌套循环,A表为内循环 B. 嵌套循环,B表为内循环 C. 散列连接 D. 索引连接
二、SQL查询(21分,每题7分)¶
假设一个数据库由以下几个表格构成:
Create Table Movie /*影片表*/
(movieID INT Primary Key, /*影片代号*/
title VARCHAR(100), /*影片名称*/
releaseDate DATE, /*出品日期*/
revenue INT, /*票房收入*/
plot VARCHAR(1000)); /*影片介绍*/
Create Table Person /*人员表*/
(personID INT Primary Key, /*人员代号*/
name VARCHAR(100), /*姓名*/
birthday DATE, /*生日*/
bio VARCHAR(1000)); /*人员简介*/
Create Table Acting /*演员-影片关系*/
(actor INT, /*演员代号*/
movieID INT, /*影片代号*/
role CHAR (100), /*角色*/
FOREIGN KEY (actor) REFERENCES Person (personID),
FOREIGN KEY (movieID) REFERENCES Movie (movieID)
);
Create Table Directing /*导演一影片关系*/
(director INT, /*导演代号*/
movieID INT, /*影片代号*/
FOREIGN KEY (director) REFERENCES Person (personID),
FOREIGN KEY (movieID) REFERENCES Movie (movieID)
);
请写出以下任务的SQL查询语句(每个任务限使用一个SQL 查询):
- 找到 Tom Hanks 在1994年出演的电影的名称;
- 找到张艺谋(作为导演)和巩俐(作为演员)总共合作了几部电影;
- 找到哪些导演指导的每一部电影都获得了超过了1亿的票房。
三、数据库设计(34分)¶
应用需求如下:
一个网球俱乐部运营了1000块分散在城市不同地方的网球场地,现想要开发一个App提供“网球训练预约服务”。用户首先通过App注册为俱乐部会员。俱乐部会收集他的个人信息,并对他的球技进行评级。随后,会员可以使用网球训练预约服务。App提供以下预约方式:
- 一位会员首先通过App在合适的时间和地理位置预约一块场地,然后发布“训练邀请”;
- 其他会员通过App查询训练邀请(用于查询的条件包括:场地的时间、位置、邀请人的性别、球龄和球技水平),找到适合自己的邀请,就向邀请人发出“训练参与请求”;
- 邀请人收到参与请求后,可以拒绝和接受请求,一旦约到足够的参与者(数量由邀请人自己确定),就可以点击“预约成功”,并关闭邀请。预约成功后,App 通过支付宝自动扣除所有参与者的场地租借费用。如果在距场地预约时间2小时仍未征集到合适的参与者,系统就自动取消场地预约,并将邀请下线。(注意:场地的出租以小时为单位,一块场地在同一时间只接受一次预约。)
要求:
- 用ER 图画出数据库的概念设计(10分);
- 给出文档数据库的结构设计,并在适当的属性上创建索引(12分);
- 给出关系数据库的结构设计,并在适当的属性上创建索引(12分)。