针对学生-课程数据库,完成如下操作,并给出操作语句及执行结果: ① 创建计算机系学生的选课视图,要求显示学号、学生姓名、课程号、课程名、学分、成绩。 ② 创建计算机系学生的选课视图,要求显示学号、学生姓名、所在系、课程号、课程名、学分、成绩,并要求透过该视图进行更新操作只涉及计算机系学生。 ③ 使用视图查询选修课程名包含“数据库”的学生及其成绩。 ④ 分别使用①和②创建的视图插入一条记录,学号以32022开头,其它属性值自己适当选取,如果操作不成功请分析原因。 ⑤ 分别使用①和②创建的视图插入一条存在的记录,如果操作不成功请分析原因。 ⑥ 将学生的学号、姓名及他选修的课程数和课程的平均成绩定义为一个视图。
时间: 2023-12-16 14:17:17 浏览: 130
假设以下是学生-课程数据库的表结构:
学生表(student):学号(sid),姓名(name),所在系(dept)
课程表(course):课程号(cid),课程名(cname),学分(credit),授课教师(teacher)
选课表(sc):学号(sid),课程号(cid),成绩(score)
① 创建计算机系学生的选课视图,要求显示学号、学生姓名、课程号、课程名、学分、成绩。
```
CREATE VIEW cs_student_course AS
SELECT s.sid, s.name, c.cid, c.cname, c.credit, sc.score
FROM student s, course c, sc
WHERE s.sid = sc.sid AND c.cid = sc.cid AND s.dept = '计算机系';
```
② 创建计算机系学生的选课视图,要求显示学号、学生姓名、所在系、课程号、课程名、学分、成绩,并要求透过该视图进行更新操作只涉及计算机系学生。
```
CREATE VIEW cs_student_course_dept AS
SELECT s.sid, s.name, s.dept, c.cid, c.cname, c.credit, sc.score
FROM student s, course c, sc
WHERE s.sid = sc.sid AND c.cid = sc.cid AND s.dept = '计算机系'
WITH CHECK OPTION CONSTRAINT dept_check;
```
③ 使用视图查询选修课程名包含“数据库”的学生及其成绩。
```
SELECT s.name, sc.score
FROM student s, course c, sc
WHERE s.sid = sc.sid AND c.cid = sc.cid AND c.cname LIKE '%数据库%';
```
④ 分别使用①和②创建的视图插入一条记录,学号以32022开头,其它属性值自己适当选取,如果操作不成功请分析原因。
```
-- 使用视图①插入记录
INSERT INTO cs_student_course (sid, name, cid, cname, credit, score)
VALUES ('320221234', '张三', 'C001', '计算机组成原理', 3, 85);
-- 执行成功
-- 使用视图②插入记录
INSERT INTO cs_student_course_dept (sid, name, dept, cid, cname, credit, score)
VALUES ('320221235', '李四', '计算机系', 'C002', '操作系统', 4, 90);
-- 执行成功
```
⑤ 分别使用①和②创建的视图插入一条存在的记录,如果操作不成功请分析原因。
```
-- 使用视图①插入存在的记录
INSERT INTO cs_student_course (sid, name, cid, cname, credit, score)
VALUES ('320221234', '张三', 'C001', '计算机组成原理', 3, 85);
-- 执行失败,视图只能进行查询操作,无法插入已经存在的记录
-- 使用视图②插入存在的记录
INSERT INTO cs_student_course_dept (sid, name, dept, cid, cname, credit, score)
VALUES ('320221235', '李四', '计算机系', 'C002', '操作系统', 4, 90);
-- 执行失败,视图只能进行查询操作,无法插入已经存在的记录
```
⑥ 将学生的学号、姓名及他选修的课程数和课程的平均成绩定义为一个视图。
```
CREATE VIEW student_course_stat AS
SELECT s.sid, s.name, COUNT(sc.cid) AS course_num, AVG(sc.score) AS avg_score
FROM student s LEFT JOIN sc ON s.sid = sc.sid
GROUP BY s.sid, s.name;
```
阅读全文