使用 SQL 进行集合查询和数据维护
[TOC]
1. 分别查询“计科系学生”和“所有男生”的并集,交集和差集。(15 分)
– 并集
SELECT *
FROM Student
WHERE Sdept='计算机系'
UNION
SELECT *
FROM Student
WHERE Sex='男'
– 交集
SELECT *
FROM Student
WHERE Sdept='计算机系'
INTERSECT
SELECT *
FROM Student
WHERE Sex='男'
– 差集
SELECT *
FROM Student
WHERE Sdept='计算机系'
EXCEPT
SELECT *
FROM Student
WHERE Sex='男'
2. 查询选修了“10001”号课程或选修了“10005”课程的学生学号 。(5 分)
SELECT Sno
FROM SC
WHERE Cno='10001'
UNION
SELECT Sno
FROM SC
WHERE Cno='10005'
3. 查询同时选修了“10001”和“10005”号课程的学生学号。(5 分)
SELECT Sno
FROM SC
WHERE Cno='10001'
INTERSECT
SELECT Sno
FROM SC
WHERE Cno='10005'
4. 查询选修了“10001”号课程,但没选“10005”号课程的学生学号。(5 分)
SELECT Sno
FROM SC
WHERE Cno='10001'
EXCEPT
SELECT Sno
FROM SC
WHERE Cno='10005'
Ø * 维护操作 *
5. 在学生表中插入一条新的学生记录,数据可自拟。(注意,插入的数据需满足完整性约束)(5 分)
INSERT INTO Student
VALUES('20030101','王芳','女',19 ,'计算机系')
6. 插入一条选课记录,学号:10010118,课程号:20008,能否插入成功?为什么?(5 分)
INSERT INTO SC(Sno,Cno)
VALUES('10010118','20008')
不能,错误提示:NSERT 语句与 FOREIGN KEY 约束 "FK_Sno" 冲突。Cno 是外键,参照 Course 中 Cno 的数值,Course 中不存在课程号为“20008”的课程记录。
7. 查询每个系及其人数,将查询结果插入到新表 Sdept_Count 中(10 分)
-- 创建表
CREATE TABLE Sdept_Count(
Sdept varchar(50),
SNum int
)
-- 插入操作
INSERT INTO Sdept_Count(Sdept,SNum)
SELECT Sdept,COUNT(Sno)
FROM Student
GROUP BY Sdept
8. 将学生“徐庆”的所在系修改为“计算机系”(5 分)
UPDATE Student
SET Sdept='计算机系'
WHERE Sname='徐庆'
9. 将所有课程的学分 Credit 提高 1 分。(5 分)
UPDATE Course
SET Credit=Credit+1
10. 将“徐庆”同学的学号修改为“19010101”,能否修改成功?为什么?(5 分)
UPDATE Student
SET Sno='19010101'
WHERE Sname='徐庆'
不能修改成功,因为该生在 SC 表中存在选课记录。
11. 将选修了“计算机基础”这门课的学生成绩提高 0.2(10 分)
UPDATE SC
SET Score=Score*1.2
WHERE Sno IN(SELECT SNO
FROM SC
WHERE Cno=(SELECT Cno
FROM Course
WHERE Cname='计算机基础'))
12. 删除学号为“10010118”的学生记录。能否成功删除?不能删除的原因?如何解决?(10 分)
不能删除,原因是 SC 表中还存在外键的约束,即“10010118”的选课记录。如果要成功删除学生“10010118”,需要先删除其所有选课记录。
DELETE FROM SC
WHERE Sno='10010118'
“
DELETE FROM Student
WHERE Sno='10010118'
13. 删除“计算机基础”这门课不及格的选课记录(10 分)
DELETE FROM SC
WHERE Score<60 AND Cno=
(SELECT Cno
FROM Course
WHERE Cname='计算机基础')
14. 把选课表 SC 清空。(5 分)
DELETE FROM SC