该文档为2020年哈尔滨工业大学数据库系统课程考试A卷的标准答案,包含详细的解题步骤与评分要点,是备考和教学的重要参考材料。
### 数据库系统期末考试知识点解析
#### 一、简答题
**1. 查询“Elsa”选修过的课程的课号及名称**
- **SQL查询语句**
```sql
SELECT cid, title
FROM Student NATURAL JOIN Course NATURAL JOIN Enroll
WHERE name = Elsa;
```
这条SQL语句通过`NATURAL JOIN`关键字连接了三个表:Student、Course和Enroll。`NATURAL JOIN`会基于这些表中相同名称的列进行连接。这里我们关注的是学生名为Elsa的情况,因此在`WHERE`子句中指定了name = Elsa。
- **关系代数表达式**
```plaintext
∏ cid, title (σ name = Elsa (Student ⨝ Course ⨝ Enroll))
```
在关系代数中,我们首先使用选择运算符`σ`来筛选出名字为Elsa的学生记录,然后使用投影运算符`∏`来选取所需的列(cid和title),最后使用笛卡尔积`⨝`来连接这三个表。
**2. 查询所选课程的总学分低于120的学生的学号及所选课程的总学分**
- **SQL查询语句**
```sql
SELECT sid, SUM(credit)
FROM Student NATURAL JOIN Enroll NATURAL JOIN Course
GROUP BY sid
HAVING SUM(credit) < 120;
```
此SQL语句首先通过`NATURAL JOIN`将三个表连接起来,然后使用`GROUP BY`对每个学生(sid)进行分组,并计算他们所有选修课程的学分总和。最后通过`HAVING`子句筛选出总学分小于120的学生。
- **关系代数表达式**
```plaintext
σ sum_credit < 120 (γ sid, sum(credit)->sum_credit (Student ⨝ Course ⨝ Enroll))
```
首先使用`⨝`连接三个表,然后使用聚集运算`γ`对sid进行分组,并计算每个学生的总学分sum(credit)。最后通过选择运算符σ来筛选出总学分小于120的学生。
**3. 查询没有选修过Database Systems,却选修了Data Mining的学生的学号**
- **SQL查询语句**
```sql
SELECT sid
FROM Student NATURAL JOIN Course NATURAL JOIN Enroll
WHERE title = Data Mining
EXCEPT
SELECT sid
FROM Student NATURAL JOIN Course NATURAL JOIN Enroll
WHERE title = Database Systems;
```
这个查询分为两部分:第一部分找出选修了Data Mining的学生,第二部分找出选修了Database Systems的学生。最后使用`EXCEPT`操作符来获取那些只选修了Data Mining但没有选修Database Systems的学生的学号。
- **关系代数表达式**
```plaintext
∏ sid (σ title = Data Mining (Student ⨝ Course ⨝ Enroll)) - ∏ sid (σ title = Database Systems (Student ⨝ Course ⨝ Enroll))
```
第一部分通过选择运算符`σ`筛选出课程名为Data Mining的学生学号,第二部分筛选出课程名为Database Systems的学生学号,最后通过差集操作符-来获取结果。
**4. 创建一个视图Unqualified(cid, title, cnt),记录每门课程的不及格人数**
- **SQL视图创建语句**
```sql
CREATE VIEW Unqualified AS
SELECT cid, title, COUNT(*) AS cnt
FROM Student NATURAL JOIN Course NATURAL JOIN Enroll
WHERE score < 60
GROUP BY cid, title;
```
通过`NATURAL JOIN`连接三个表,使用`WHERE`子句筛选出分数小于60的学生记录,然后使用`GROUP BY`对每门课程进行分组,并计算不及格的学生人数。
**5. 是否可以在视图Unqualified上进行INSERT、DELETE或UPDATE操作?说明原因。**
- **答案**
不可以,因为视图Unqualified的定义中含有`GROUP BY`查询。通常情况下,如果视图中包含了聚合函数或者`GROUP BY`等操作,则不能在其上直接执行插入、删除或更新操作。
**6. 用SQL编写一个查询,说明如何根据该查询的结果验证Student的关系实例是否满足函数依赖email → sid。**
- **SQL 查询语句**
```sql
SELECT * FROM Student S1 JOIN Student S2 ON (S1.email = S2.email AND S1.sid != S2.sid);
```
这个查询通过`JOIN`操作来找出存在相同电子邮件地址(email)但学号(sid)不同的记录。如果查询结果为空,则说明关系实例满足函数依赖email → sid,即每个不同的电子邮件地址对应唯一的学生学号。
### 二、计算与证明题
**1.