### 数据库实验题知识点解析
#### 实验一:交互式SQL的使用实验要求与解析
**1. 创建数据库与表结构**
- **创建Student数据库**:主要包括`Students`(学生)、`Courses`(课程)、`SC`(选课)三个表。
- `Students(SNO, SNAME, SEX, BDATE, HEIGHT, DEPARTMENT)`:其中`SNO`为主键,`SEX`和`DEPARTMENT`分别为性别和所在部门。
- `Courses(CNO, CNAME, LHOUR, CREDIT, SEMESTER)`:其中`CNO`为主键,`LHOUR`为上课时长,`CREDIT`为学分,`SEMESTER`为学期。
- `SC(SNO, CNO, GRADE)`:其中`SNO`和`CNO`共同作为主键,`GRADE`为成绩。`SNO`和`CNO`分别为外键关联`Students`表中的`SNO`和`Courses`表中的`CNO`。
- **插入数据**:根据实际情况填充每个表的数据。
**2. 查询与更新要求**
- **查询示例**:
- **查询身高大于1.80m的男生的学号和姓名**:可以使用`SELECT SNO, SNAME FROM Students WHERE SEX = '男' AND HEIGHT > 1.80;`
- **查询计算机系秋季所开课程的课程号和学分数**:使用`SELECT CNO, CREDIT FROM Courses WHERE DEPARTMENT = '计算机系' AND SEMESTER = '秋季';`
- **查询选修计算机系秋季所开课程的男生的姓名、课程号、学分数、成绩**:通过连接`Students`, `Courses`, `SC`三个表来实现:`SELECT S.SNAME, SC.CNO, C.CREDIT, SC.GRADE FROM Students S INNER JOIN SC ON S.SNO = SC.SNO INNER JOIN Courses C ON SC.CNO = C.CNO WHERE S.SEX = '男' AND C.DEPARTMENT = '计算机系' AND C.SEMESTER = '秋季';`
- **更新示例**:
- **在`STUDENT`和`SC`关系中,删去SNO以‘01’开头的所有记录**:使用`DELETE FROM Student WHERE SNO LIKE '01%'; DELETE FROM SC WHERE SNO LIKE '01%';`
- **在`STUDENT`关系中增加以下记录**:例如`INSERT INTO Student (SNO, SNAME, SEX, BDATE, HEIGHT, DEPARTMENT) VALUES ('010001', '张三', '男', '1995-01-01', 1.75, '计算机系');`
- **将课程CS-221的学分数增为3,讲课时数增为60**:`UPDATE Courses SET CREDIT = 3, LHOUR = 60 WHERE CNO = 'CS-221';`
**3. 补充题解析**
- **统计各系的男生和女生的人数**:使用`GROUP BY`和`COUNT()`函数:`SELECT DEPARTMENT, SEX, COUNT(*) AS COUNT FROM Students GROUP BY DEPARTMENT, SEX;`
- **列出学习过‘编译原理’,‘数据库’或‘体系结构’课程,且这些课程的成绩之一在90分以上的学生的名字**:使用`IN`和`GROUP BY`结合`HAVING`子句:`SELECT S.SNAME FROM Students S INNER JOIN SC ON S.SNO = SC.SNO INNER JOIN Courses C ON SC.CNO = C.CNO WHERE C.CNAME IN ('编译原理', '数据库', '体系结构') GROUP BY S.SNAME HAVING MAX(SC.GRADE) >= 90;`
**4. 选做题**
- **对每门课增加“先修课程”的属性**:可以在`Courses`表中添加一个新列`PRE_REQ`,用于存储先修课程的课程号。
- **查询示例**:例如查询有资格选修数据库课程的所有学生:`SELECT DISTINCT S.SNAME FROM Students S INNER JOIN SC ON S.SNO = SC.SNO INNER JOIN Courses C ON SC.CNO = C.CNO WHERE C.PRE_REQ IN (SELECT CNO FROM Courses WHERE CNAME = '数据库') AND SC.GRADE >= 60;`
#### 实验二:数据库的安全和完整性约束
**1. 新增表和视图**
- **新增表`Credits`**:用于存储每名学生通过选修课程的合计学分数和不及格的课程数。
- **创建视图`Student_Grade`**:包含学生选修课程及成绩的详细信息。
**2. 触发器**
- **触发器`Upd_Credit`**:当在`SC`表中插入一条选课成绩时,自动触发更新`Credits`表中的合计学分数和不及格课程数。
- **触发器`Upd_StuView`**:当对视图`Student_Grade`进行插入数据项操作时,自动触发对`SC`表的插入操作,并检查学生和课程是否已存在于`Students`和`Courses`表中。
**3. 安全机制设计**
- **创建用户**:分别为学生、老师、教务员创建三个不同的用户,并设置相应的登录密码。
- **权限分配**:
- 学生:只允许查询课程信息和个人成绩。
- 老师:查询学生信息、成绩信息和课程信息。
- 教务员:查询和修改学生信息和课程信息。
#### 实验三:SQL编程
**1. 创建存储过程**
- **创建存储过程`Add_Student`**:用于向`Students`表中添加新的学生信息。
- 输入参数:`SNO`(学号)、`SNAME`(姓名)、`SEX`(性别)等。
- 功能:根据输入参数将新学生信息插入到`Students`表中。