数据库系统教程(第二版何玉洁)课后数据库上机实验答案
2016-11-08 13:07
1731 查看
附录C 上机实验
C.1 第4章上机实验
------------------------------------------陈宇超,仅供参考
-------------------------------------------------
下列实验均使用SQL Server 的SSMS工具实现。
1.用图形化方法创建符合如下条件的数据库(创建数据库的方法可参见本书附录A):
l 数据库名为:学生数据库
l 主要数据文件的逻辑文件名为:Students_data,存放在D:\Data文件夹下(若D:盘中无此文件夹,请先建立此文件夹,然后再创建数据库。),初始大小为:5MB,增长方式为自动增长,每次增加1MB。
l 日志文件的逻辑文件名字为:Students_log,也存放在D:\Data文件夹下,初始大小为:2MB,增长方式为自动增长,每次增加10%。
2.选用已建立的“学生数据库”,写出创建满足表C-1到4-4条件的表的SQL语句,并执行所写代码。(注:“说明”部分不作为表定义内容)
表C-1 Student表结构
列名 | 说明 | 数据类型 | 约束 |
Sno | 学号 | 普通编码定长字符串,长度为7 | 主键 |
Sname | 姓名 | 普通编码定长字符串,长度为10 | 非空 |
Ssex | 性别 | 普通编码定长字符串,长度为2 | 取值范围:{男,女} |
Sage | 年龄 | 微整型(tinyint) | 取值范围:15-45 |
Sdept | 所在系 | 普通编码不定长字符串,长度为20 | 默认值为“计算机系” |
Sid | 身份证号 | 普通编码定长字符串,长度为10 | 取值不重 |
Sdate | 入学日期 | 日期 | 默认为系统当前日期 |
列名 | 说明 | 数据类型 | 约束 |
Cno | 课程号 | 普通编码定长字符串,长度为10 | 主键 |
Cname | 课程名 | 普通编码不定长字符串,长度为20 | 非空 |
Credit | 学时数 | 整型 | 取值大于0 |
Semester | 学分 | 小整型 | |
列名 | 说明 | 数据类型 | 约束 |
Sno | 学号 | 普通编码定长字符串,长度为7 | 主键,引用Student的外键 |
Cno | 课程号 | 普通编码定长字符串,长度为10 | 主键,引用Course的外键 |
Grade | 成绩 | 小整型 | 取值范围为0-100 |
列名 | 说明 | 数据类型 | 约束 |
Tno | 教师号 | 普通编码定长字符串,长度为8 | 非空 |
Tname | 教师名 | 普通编码定长字符串,长度为10 | 非空 |
Salary | 工资 | 定点小数,小数点前4位,小数点后2位 | |
3. 写出实现如下功能的SQL语句,并执行所写代码,查看执行结果。
(1) 在Teacher表中添加一个职称列,列名为:Title,类型为nchar(4)。
ALTER TABLE Teacher
ADD Title
VARCHAR(4)
(2) 为Teacher表中的Title列增加取值范围约束,取值范围为:{教授,副教授,讲师}。
ALTER TABLE Teacher
ADD CONSTRAINT
TitleCHECK(TitleIN('教授','副教授','讲师'))
(3) 将Course表中Credit列的类型改为:tinyint。
注意:这里首先需要先删除Credit的约束,修改完数据类型后再重新添加约束项
ALTER TABLE Course
DROP CONSTRAINT
CK__Course__Credit__2B3F6F97
ALTER TABLE Course
ALTER COLUMN CreditTINYINT
ALTER TABLE Course
ADD CONSTRAINT
CreditCHECK(Credit>0)
(4) 删除Student表中的Sid和Sdate列。
注意:这里首先需要先删除约束
ALTER TABLE Student
DROP CONSTRAINT
UQ__Student__CA1E5D79B3204FCF
ALTER TABLE Student
DROP CONSTRAINT
DF__Student__Sdate__3B75D760
ALTER TABLE Student
DROP COLUMN
Sdate,Sid
(5) 为Teacher表添加主键约束,其主键为:Tno。
ALTER TABLE Teacher
ADD PRIMARY
KEY(Tno)
※建立数据库主要文件和日志文件
https://img-blog.csdn.net/20161108131919403?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
※我们可以看到D盘增加了主要数据文件.mdf和日志文件.ldf
https://img-blog.csdn.net/20161108132029576?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
※给students_data建立表格
createtableStudent( Sno char(7), Sname char(10)notnull, Ssex char(2) check(Ssex='男'orSsex='女'), Sage tinyint check(Sage>14AND Sage<46), Sdept varchar(20) default'计算机系', Sid char(10) unique,--身份证号 Sdate date default getdate() primary key(Sno) ) |
create table Course( Cno char(10) primary key, Cname varchar(20) notnull, Credit intcheck (Credit>0), Semester tinyint, ) |
create tableSC( Sno char(7), Cno char(10), Grade tinyint check(Grade>=0AND Grade<=100) foreign key(Sno) references Student(Sno), foreign key(Cno) references Course(Cno) ) |
create table Teacher( Tno char(8) not null, Tname char(10)notnull, Salary decimal(6,2) ) |
C.2 第5章上机实验
本实验均在SQL Server 的SSMS工具中实现。首先在已创建的“学生数据库”中创建本章表5-1~5-3所示的Student、Course和SC表,并插入表5-4~5-6所示数据,然后编写实现如下操作的SQL语句,执行所写的语句,并查看执行结果。有关建表及所需要的数据,见本章末尾
1. 查询SC表中的全部数据。
SELECT * FROM
SC
2. 查询计算机系学生的姓名和年龄。
SELECT Sname,Sage FROM
Student WHERE
Sdept='计算机系'
3. 查询成绩在70~80分的学生的学号、课程号和成绩。
SELECT Sno,Cno,Grade FROM
SC WHERE
Grade between 70 AND 80
4. 查询计算机系年龄在18~20岁的男生姓名和年龄。
SELECT Sname,Sage FROM Student
WHERE Sdept='计算机系'AND Sage
BETWEEN 18 AND 20
AND Ssex='男'
5. 查询C001课程的最高分。
SELECT MAX(grade) AS 最高成绩
FROMSC WHERE Cno='C001'
6. 查询计算机系学生的最大年龄和最小年龄。
SELECT MAX(Sage) AS 年长,MIN(Sage)
AS 年幼 FROM
Student WHERE Sdept='计算机系'
7. 统计每个系的学生人数。
SELECT Sdept,COUNT(Sno)
AS 人数
FROM Student GROUP BY Sdept
8. 统计每门课程的选课人数和最高成绩。
SELECT Cno,COUNT(Sno)
AS 人数,MAX(Grade) AS
最高成绩 FROM
SC GROUP BY Cno
9. 统计每个学生的选课门数和考试总成绩,并按选课门数升序显示结果。
SELECT Sno,COUNT(Cno)
AS 选课数量,SUM(Grade) AS
考试总成绩 FROM
SC GROUP BY Sno
10. 列出总成绩超过200的学生的学号和总成绩。
SELECT Sno,SUM(Grade)
AS 考试总成绩
FROM SC GROUPBY
Sno HAVING
SUM(Grade)>200
11. 查询选了C002课程的学生姓名和所在系。
SELECT Sname,Sdept FROM Student
st,SC sc
WHERE st.Sno=sc.Sno
AND Cno='C002'
或者
SELECT Sname,Sdept FROM Student
WHERE Sno
IN(SELECTSno FROM
SC WHERE Cno='C002')
或者
SELECT Sname,Sdept FROM Student
WHERE EXISTS (SELECT * FROM
SC WHERE Sno=
Student.Sno AND Cno
=
'C002')
12. 查询考试成绩80分以上的学生姓名、课程号和成绩,并按成绩降序排列结果。
SELECT Sname,Cno,Grade FROM
Student,SC WHERE Student.Sno=SC.Sno
AND Grade>80 ORDERBY
Grade DESC
13. 查询与VB在同一学期开设的课程的课程名和开课学期。
SELECT c2.Cname,c2.Semester
FROM Course
c1,Coursec2 WHERE c1.Cname=c2.Cname
AND c1.Cname='VB'
AND c2.Cname!='VB'
14. 查询与李勇年龄相同的学生的姓名、所在系和年龄。
SELECT s2.Sname,s2.Sdept,s2.Sage
FROM Student
s1,Students2 WHERE s1.Sage=s2.Sage
AND s1.Sname='李勇'
AND s2.Sname!='李勇'
或者
SELECT Sname,Sdept,Sage FROM
Student WHERE
Sage=(SELECT Sage FROM
Student WHERE
Sname='李勇') AND Sname!='李勇'
15. 查询哪些课程没有学生选修,列出课程号和课程名。
SELECT Course.Cno,Course.Cname
FROM Course
LEFT JOIN
SC on SC.Cno=Course.Cno
WHERE SC.Cno IS NULL
16. 查询每个学生的选课情况,包括未选课的学生,列出学生的学号、姓名、选的课程号。
SELECT Student.Sno,Student.Sname,Cno
FROM Student
LEFT JOIN
SC ON SC.Sno=Student.Sno
17. 查询计算机系哪些学生没有选课,列出学生姓名。
SELECT Sname FROM
Student WHERE
Sdept='计算机系' AND Sno
NOT IN(SELECT Sno FROM
SC)
或者
SELECT Sname FROM
Student S
LEFTJOIN SC
ON S.Sno=SC.Sno
WHERE Sdept=
'计算机系' AND
SC.Cno IS
NULL
18. 查询计算机系年龄最大的三个学生的姓名和年龄。
SELECT Top 3 Sname, Sage FROM
Student WHERE
Sdept='计算机系' ORDER BY
Sage DESC
19. 列出“VB”课程考试成绩前三名的学生的学号、姓名、所在系和VB成绩。
SELECT TOP 3 WITH
TIES Sname,Sdept,Grade FROM
StudentS
JOIN SC on
S.Sno=
SC.Sno JOIN Course
C ON
C.Cno=SC.Cno WHERE Cname=
'VB' ORDER BY Grade DESC
20. 查询选课门数最多的前2位学生,列出学号和选课门数。√
SELECT top 2Sno,COUNT(Cno)
AS 选课数
FROM SC GROUPBY
Sno ORDER
BY COUNT(Cno) DESC
21. 查询计算机系学生姓名、年龄和年龄情况,其中年龄情况为:如果年龄小于18,则显示“偏小”;如果年龄在18-22,则显示“合适”;如果年龄大于22,则显示“偏大”。 √
SELECT Sno,Sage,
CASE
WHEN Sage<18 THEN '偏小'
WHEN Sage>=18 AND
Sage<=22 THEN '适合'
WHEN Sage>22 THEN '偏大'
END
AS
年龄情况 FROM Student
22. 统计每门课程的选课人数,包括有人选的课程和没有人选的课程,列出课程号,选课人数及选课情况,其中选课情况为:如果此门课程的选课人数超过100人,则显示“人多”;如果此门课程的选课人数在40~100,则显示“一般”;如果此门课程的选课人数在1~40,则显示“人少”;如果此门课程没有人选,则显示“无人选”。 √
SELECT Course.Cno,COUNT(Sno)
AS 选课人数,
CASE
WHEN COUNT(Sno)>100 THEN
'人多'
WHEN COUNT(Sno)<40 AND
COUNT(Sno)>0 THEN '人少'
WHEN COUNT(Sno)<=100 AND
COUNT(Sno)>=40 THEN '一般'
WHEN COUNT(Sno)=0 THEN
'无人选'
end
AS 人数情况
FROM SC RIGHT JOIN Course
ON Course.Cno=SC.Cno
GROUP BY
Course.Cno
23. 查询计算机系选了VB课程的学生姓名、所在系和考试成绩,并将结果保存到新表VB_Grade中。√
v 局部临时表:#新表名。局部于当前连接,生命期同连接期。
v 全局临时表: ##新表名。可在所有连接中使用,生命期同用户连接期
v 永久表: 新表名,存储在磁盘上
v 格式:SELECT选择列表 INTO新表名
FROM 子句 …
SELECT Sname,Sdept,Grade INTO
VB_Grade FROM
Student,SC,Course
WHERE Student.Sno=SC.Sno
AND Course.Cno=SC.Cno
AND Cname='VB'
24. 统计每个系的女生人数,并将结果保存到新表Girls中。√
SELECT Sdept,Ssex,COUNT(Ssex)
AS 人数
Into Girls FROM Student WHERE
Ssex='女' GROUP BY Sdept,Ssex
25. 用子查询实现如下查询:
(1)查询选了“C001”课程的学生姓名和所在系。√
SELECT Sname,Sdept FROM Student
WHERE Sno
IN (SELECT Sno FROM
SC
WHERE
Cno='C001')
(2)查询通信工程系成绩80分以上的学生的学号和姓名。√
SELECT Sno,Sname FROM Student
WHERE Sdept='通信工程系' AND Sno
IN(SELECT
Sno
FROM
SC WHERE Grade>80)
(3)查询计算机系考试成绩最高的学生的姓名。√
SELECT Sname
FROM Student,SC WHERE SC.Sno=Student.Sno
AND
Sdept='计算机系' AND
Gradein
(SELECTMAX(Grade) FROM
SC,Student WHERE SC.Sno=Student.Sno
AND Sdept='计算机系')
(4)查询年龄最大的男生的姓名、所在系和年龄。√
SELECT Sname,Sdept,Sage FROM
Student WHERE
Ssex='男' AND Sage
in
(SELECT MAX(Sage) FROM
Student WHERE Ssex='男')
26. 查询C001课程的考试成绩高于该课程平均成绩的学生的学号和成绩。
SELECT Sno,Grade
FROM SC WHERE
Cno=
'C001' AND
Grade>(
SELECT AVG(Grade)
FROM SC
WHERE
Cno
='C001')
27. 查询计算机系学生考试成绩高于计算机系学生平均成绩的学生的姓名、考试的课程名和考试成绩。
SELECT Sname,Sdept,Cname,Grade
FROM Student,SC,Course WHERE
Student.Sno=SC.Sno AND
Course.Cno=SC.Cno AND
Sdept='计算机系' AND
Grade>(SELECT AVG(Grade)
FROM SC,Course,Student
WHERE SC.Cno=Course.Cno
AND Student.Sno=SC.Sno
AND Sdept='计算机系')
28. 查询VB课程考试成绩高于VB平均成绩的学生姓名和VB成绩。
SELECT Sname,Grade FROM Student,SC,Course
WHERE Student.Sno
=SC.Sno AND Course.Cno=SC.Cno
AND Cname='VB' AND Grade>
(SELECT AVG(Grade) FROM
SC,Course WHERE Course.Cno=SC.Cno
AND Cname='VB')
29. 查询没选VB的学生姓名和所在系。
SELECT Sname, Sdept FROM Student
WHERE Sno
NOT IN(SELECT Sno FROM
SC,Course WHERE
SC.Cno=Course.Cno AND
Cname='VB')
或者
SELECT Sname,Sdept FROM Student
WHERE NOT
EXISTS(SELECT*
FROM SC,Course WHERE Course.Cno=SC.Cno
AND Sno=Student.Sno AND Cname='VB')
30. 查询每个学期学分最高的课程信息,列出开课学期、课程名和学分。
SELECT Cname,Semester,Credit
FROM Course
c1 WHERE
NOT EXISTS
(SELECT * FROM
Course c2
WHERE c1.Semester=c2.Semester AND
c1.Credit<c2.Credit)
31. 查询每门课程考试成绩最高的学生信息,列出课程号、学生姓名和最高成绩,结果按课程号升序排序,不包括没考试的课程。
SELECT Cname,sname,SC.Cno,Grade
FROM student join
sc on student. sno=sc. sno
join course
on course.cno=sc.cno
WHERE grade=(SELECT max (grade)
FROM sc
WHERE cno=course.cno) order
BY SC.Cno ASC
或者
SELECT sc1.sno,Sname,Cno, Grade
FROM SC
sc1,student WHERE not
exists
(SELECT * FROM
SC sc2
WHERE sc1.Cno=sc2.Cno AND
sc1.Grade<sc2.Grade)
AND Grade
IS NOT
NULL AND Student.Sno=sc1.Sno
order BY
Cno ASC
32. 查询选了全部课程的学生姓名
SELECT Sname FROM
Student WHERE
Sno in
(SELECT Sno FROM
SC GROUP
BY Sno having COUNT(*)=
(SELECT COUNT(*) FROM
Course))
或者
SELECT Sname FROM
student
WHERE NOTexists(SELECT*FROM
course
WHERE NOT exists(SELECT*FROM
SC
WHERE Sno=student.sno AND
cno=Course.Cno))
33. 创建一个新表,表名为test,其结构为(COL1, COL 2, COL 3),其中,
COL1:整型,允许空值。
COL2:普通编码定长字符型,长度为10,不允许空值。
COL3:普通编码定长字符型,长度为10,允许空值。
试写出按行插入如下数据的语句(空白处表示是空值)。
COL1 | COL2 | COL3 |
| B1 | |
1 | B2 | C2 |
2 | B3 | |
create table test( C0L1 int, C0L2 char(10) not null, C0L3 char(10) ) insert into test(C0L2) values('B1') insert into test values(1,'B2','C2') insert into test(C0L1,C0L2) values(2,'B3') |
34. 利用23题建立的VB_Grade表,将信息管理系选了VB课程的学生姓名、所在系和考试成绩插入到VB_Grade表中。
INSERT INTO VB_Grade
SELECT Sname,Sdept ,Grade FROM Student,SC,Course
WHERE Student.Sno=SC.Sno
AND
SC.Cno=Course.Cno
AND Sdept='信息管理系' AND Cname='VB'
35. 将所有选修C001课程的学生的成绩加10分。
UPDATE SC SET
Grade=Grade+10 WHERE Cno='C001'
36. 将计算机系所有学生的“计算机文化学”的考试成绩加10分。
UPDATE SC SET
Grade=Grade+10 WHERE
Sno
in( SELECT
SC.Sno
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno
AND SC.Cno=Course.Cno
AND
Sdept='计算机系' AND Cname='计算机文化学')
37. 修改“VB”课程的考试成绩,如果是通信工程系的学生,则增加10分;如果是信息管理系的学生则增加5分,其他系的学生不加分。
UPDATE SC SET
Grade=Grade+
CASE Sdept
WHEN '通信工程系' THEN 10
WHEN '信息管理系' THEN 5
else 0
end
FROM Student,SC,Course
WHERE SC.Sno=Student.Sno
AND Course.Cno=SC.Cno
AND Cname='VB'
38. 删除成绩小于50分的学生的选课记录。
DELETE FROMSC
WHERE Grade<50
39. 删除计算机系VB考试成绩不及格学生的VB选课记录。
DELETE FROM SC
FROM SC,Student,Course WHERE
SC.Sno=Student.Sno
AND SC.Cno=Course.Cno
ANDSdept='计算机系' AND
Cname='VB' AND Grade<60
40. 删除“VB”考试成绩最低的学生的VB修课记录。
DELETE FROM SC
FROM SC,Course
WHERE SC.Cno=Course.Cno
AND Cname='VB'
AND
Grade=
(SELECT MIN(Grade) FROM
SC,Course WHERE SC.Cno=Course.Cno
AND Cname='VB')
41. 删除没人选的课程的基本信息。
DELETE FROM Course
FROM Course
left joinSC
on Course.Cno=SC.Cno
WHERE SC.Cno IS NULL
本章有关建表和插入表格中的数据
CREATE TABLE Student( Sno CHAR(7) PRIMARYKEY, Sname NCHAR(5) NOTNULL, Ssex NCHAR(1), Sage TINYINT, Sdept NVARCHAR(20) ) |
CREATE TABLE Course( Cno CHAR(6), Cname NVARCHAR(20) NOTNULL, Credit TINYINT, Semester TINYINT, PRIMARYKEY(Cno) ) |
CREATE TABLE SC( Sno CHAR(7) NOTNULL, Cno CHAR(6) NOTNULL, Grade TINYINT, PRIMARYKEY(Sno,Cno), FOREIGNKEY(Sno) REFERENCES Student(Sno), FOREIGNKEY(Cno) REFERENCES Course(Cno) ) |
insert into student values('0811101','李勇','男',21,'计算机系') insert into student values('0811102','刘晨','男',20,'计算机系') insert into student values('0811103','王敏','女',20,'计算机系') insert into student values('0811104','张小红','女',19,'计算机系') insert into student values('0821101','张立','男',20,'信息管理系') insert into student values('0821102','吴宾','女',19,'信息管理系') insert intos tudent values('0821103','张海','男',20,'信息管理系') insert into student values('0831101','钱小平','女',21,'通信工程系') insert into student values('0831102','王大力','男',20,'通信工程系') insert into student values('0831103','张姗姗','女',19,'通信工程系') insert into course values('C001','高等数学',4,1) insert into course values('C002','大学英语',3,1) insert into course values('C003','大学英语',3,2) insert into course values('C004','计算机文化学',2,2) insert into course values('C005','VB',2,3) insert into course values('C006','数据库基础',4,5) insert into course values('C007','数据结构',4,4) insert intoc ourse values('C008','计算机网络',4,4) insert into sc values('0811101','C001',96) insert into sc values('0811101','C002',80) insert into sc values('0811101','C003',84) insert into sc values('0811101','C005',62) insert into sc values('0811102','C001',92) insert into sc values('0811102','C002',90) insert into sc values('0811102','C004',84) insert into sc values('0821102','C001',76) insert into sc values('0821102','C004',85) insert into sc values('0821102','C005',73) insert into sc values('0821102','C007',NULL) insert into sc values('0821103','C001',50) insert into sc values('0821103','C004',80) insert into sc values('0831101','C001',50) insert into sc values('0831101','C004',80) insert into sc values('0831102','C007',NULL) insert into sc values('0831103','C004',78) insert into sc values('0831103','C005',65) insert into sc values('0831103','C007',NULL) |
C.3 第6章上机实验
下列实验均使用SQL Server 的SSMS工具实现。利用第4章上机实验创建的“学生数据库”中Student、Course和SC表,完成下列实验。1. 写出实现下列操作的SQL语句,并执行所写代码。
(1)在Student表上为Sname列建立一个聚集索引,索引名为:IdxSno。(提示:若执行创建索引的代码,请先删除该表的主键约束)
注意: 一个表只能有一个聚集索引,可以有多个非聚集索引 (聚集索引对数据按索引关键字值进行物理排序,数据行本身只能按一个顺序存储) Student本身创建主键(Sno)的同时会默认创建唯一聚集索引,且Sno为SC表的外键,所以,首先要删除SC表的外键约束,再删除Student表的主键约束 ----chenyuchao |
ALTER TABLE
SC DROP CONSTRAINT FK__SC__Sno__31EC6D26
ALTER
TABLE STUDENT
DROP CONSTRAINT PK__Student__CA1FE464CD8CBE4F
CREATE
CLUSTERED INDEX idxSno
ON Student(Sname)
(2)在Course表上为Cname列建立一个唯一的非聚集索引,索引名为:IdxCN
CREATE unique NONCLUSTERED INDEX idxCN
ON Course(Cname)
(如果是在表中数据都插入完成后建立索引,此处会报错,因为Cname中有两个不同学期的大学英语课程,就不唯一了,请注意)
(3)在SC表上为Sno和Cno建立一个组合的聚集索引,索引名为:IdxSnoCno。(提示:若执行创建索引的代码,请先删除该表的主键约束)
同样需要删除主键约束
ALTER TABLE SC
DROP CONSTRAINT
PK__SC__E6000253A86AC951
CREATE CLUSTERED INDEX
idxSnoCno ON SC(Sno,Cno)
(4)删除Sname列上建立的IdxSno索引。
DROP INDEX Student.idxSno
2. 写出创建满足下述要求的视图的SQL语句,并执行所写代码。
(1)查询学生的学号、姓名、所在系、课程号、课程名、课程学分。
CREATE VIEW v1
AS
SELECT Student.Sno,Sname,Sdept,SC.Cno,Cname,Credit
FROM student,SC,Course
WHERE Student.Sno=SC.Sno
AND Course.Cno=SC.Cno
GO
(2)查询学生的学号、姓名、选修的课程名和考试成绩。
CREATE VIEW v2
AS
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno
AND Course.Cno=SC.Cno
GO
(3)统计每个学生的选课门数,要求列出学生学号和选课门数。
CREATE VIEW v3
AS
SELECT Sno,COUNT(Cno) Coursenum
FROM SC
GROUP BY Sno
GO
(4)统计每个学生的修课总学分,要求列出学生学号和总学分(说明:考试成绩大于等于60才可获得此门课程的学分)。
CREATE VIEW v4
AS
SELECT Sno,SUM(Credit)
Creditsum
FROM SC,Course WHERE
SC.Cno=Course.Cno AND
Grade>=60 GROUP BY
Sno
GO
3. 利用第2题建立的视图,完成如下查询。
(1)查询考试成绩大于等于90分的学生的姓名、课程名和成绩。
SELECT Sname,Cname,Grade
FROM v2
WHERE Grade>=90
(2)查询选课门数超过3门的学生的学号和选课门数。
SELECT Sname,Cname,Grade
FROM v2
WHERE Grade>=90
(3)查询计算机系选课门数超过3门的学生的姓名和选课门数。
SELECT Sname,Cnum FROM Student,v3
WHERE v3.Sno=Student.SnoANDSdept='计算机系'
AND Coursenum>3
(4)查询修课总学分超过10分的学生的学号、姓名、所在系和修课总学分。
SELECT Student.Sno,Sname,Sdept,Creditsum FROM
Student,v4
WHERE v4.Sno=Student.SnoAND
Creditsum>10
(5)查询年龄大于等于20岁的学生中,修课总学分超过10分的学生的姓名、年龄、所在系和修课总学分。
SELECT Sname,Sage,Sdept,Creditsum FROM
Student,v4
WHERE v4.Sno=Student.Sno
AND Creditsum>10 AND Sage>=20
4. 修改第3题(4)定义的视图,使其查询每个学生的学号、总学分以及总的选课门数。
ALTER VIEW v4 AS
SELECT Sno,SUM(Credit)
Creditsum,COUNT(SC.Cno)
Coursenum
FROM SC,Course WHERE
SC.Cno=Course.Cno GROUPBY
Sno
C.4 第7章上机实验
利用第5章建立的学生数据库以及Student、Coures和SC表,完成下列操作。1. 创建满足如下要求的后触发型触发器
。
说明:对于insert into表名 values() 单行插入语句,触发器每次都会被触发 对于 insert into表名 selec FROM表名 或者是 insert into 表名 values (),(),()....多行插入语句,触发器只会触发一次,所有的插入数据都会一并备份到inserted表中,然后执行触发筛选----chenyuchao |
(1)限制学生的考试成绩必须在0-100之间。
CREATE TRIGGER tri1
ON SC after insert
AS
if
exists( SELECT
GradeFROM inserted
WHERE Grade
not between 0 AND 100)
rollback
go
(2)限制不能删除成绩不及格的考试记录。
CREATE TRIGGER tri2
ON SC
AFTER DELETE
AS
if
exists(SELECT
* FROM deleted
WHERE Grade<60)
rollback
go
(3)限制每个学期开设的课程总学分不能超过20。
CREATE TRIGGER tri3
ON Course
AFTER INSERT
AS
if exists( SELECT
SUM(Credit) FROM Course
GROUP BY Semester having SUM(Credit)>20)
rollback
go
(4)限制每个学生每学期选的课程不能超过5门。
CREATE TRIGGER tri4
ON SC
AFTER INSERT
AS
if exists( SELECT
COUNT(SC.Cno) FROM SC,Course
WHERE SC.Cno=Course.Cno
GROUPBY Semester,Sno having COUNT(SC.Cno)>5)
ROLLBACK
go
2. 创建满足如下要求的存储过程。
(1)查询每个学生的修课总学分,要求列出学生学号及总学分。
CREATE PROC p1
AS
SELECT Student.Sno,SUM(Credit)
CreditSum FROM
Student,SC,Course
WHERE Student.Sno=SC.Sno
AND SC.Cno=Course.Cno
GROUP BY
Student.Sno
执行:execp1
(2)查询学生的学号、姓名、修的课程号、课程名、课程学分,将学生所在的系作为输入参数,执行此存储过程,并分别指定一些不同的输入参数值。
CREATE PROC p2
@dept char(20)='信息管理系'
AS
SELECT Student.Sno,Sname,SC.Cno,Course.Cname,Credit
FROM Student, SC, Course
WHERE Student.Sno=SC.Sno
AND SC.Cno=Course.Cno
AND Sdept=@dept
执行: execp2
执行:
exec
p2@dept='计算机系'
(3)查询指定系的男生人数,其中系为输入参数,人数为输出参数。
CREATE
PROC p3
@dept char(20),@number int output
AS
SELECT@number=COUNT(Sno)
FROM Student
WHERE Sdept=@dept AND Ssex='男'
执行: declare @numint
exec p3 计算机系,@num output
print @num
(4)删除指定学生的修课记录,其中学号为输入参数。
CREATE PROC p4
@sno char(20)
AS
delete FROM SC
WHERE Sno=@sno
执行:exec p4' 0811101'
(5)修改指定课程的开课学期。输入参数为:课程号和修改后的开课学期。
Create Proc p5
@cno char(20), @semester Int
AS
update Course set
Semester=@semester WHERE Cno=@cno
执行:execp5'C001',4
C.5第11章上机实验
利用第4、5章建立的学生数据库和其中的Student、Course、SC表,并利用SSMS工具完成下列操作。1. 用SSMS工具建立SQL Server身份验证模式的登录名:log1、log2和log3。
2. 用log1建立一个新的数据库引擎查询,在“可用数据库”下列列表框中是否能选中学生数据库?为什么?
3. 用系统管理员身份建立一个新的数据库引擎查询,将log1、log2和log3映射为学生数据库中的用户,用户名同登录名。
4. 在log1建立的数据库引擎查询中,现在在“可用数据库”下列列表框中是否能选中学生数据库?为什么?
5. 在log1建立的数据库引擎查询中,选中学生数据库,执行下述语句,能否成功?为什么?
SELECT * FROMCourse
6. 在系统管理员的数据库引擎查询中,执行合适的授权语句,授予log1具有对Course表的查询权限,授予log2具有对Course表的插入权限。
7. 用log2建立一个新的数据库引擎查询,执行下述语句,能否成功?为什么?
INSERT INTO Course VALUES('C1001','数据库基础',4,5)
再执行下述语句,能否成功?为什么?
SELECT * FROMCourse
8. 在log1建立的数据库引擎查询中,再次执行下述语句:
SELECT* FROM Course
这次能否成功?但如果执行下述语句:
INSERTINTO Course VALUES('C103','软件工程',4, 5)
能否成功?为什么?
9. log3建立一个新的数据库引擎查询,执行下述语句,能否成功?为什么?
CREATE TABLE NewTable(
C1 int,
C2 char(4))
10. 授予log3在学生数据库中具有创建表的权限。
11. 在系统管理员的数据库引擎查询中,执行下述语句:
GRANT CREATE TABLETO log3
GO
CREATE SCHEMA log3AUTHORIZATION log3
GO
ALTER USER log3WITH DEFAULT_SCHEMA = log3
12. 在log3建立一个新的数据库引擎查询中,再次执行第9题的语句,能否成功?为什么?
如果执行下述语句:
SELECT * NewTable
能否成功?为什么?
相关文章推荐
- Oracle+10g数据库系统教程与上机指导_习题答案
- 山东大学数据库系统实验答案
- 数据库系统简明教程 第三章关系数据库 课后习题
- 数据库系统基础教程第三版 部分实验命令
- 【黑金视频连载】FPGA NIOSII视频教程(11)--系统时钟实验
- 鸟哥的Linux私房菜基础学习篇(第二版)第五章课后习题与答案
- 数据库从文件系统转移至ASM实验记录
- 【转帖】Windows文件系统过滤驱动开发教程(第二版)
- 实验一数据库系统设计的实验报告
- 《零基础入门学习汇编语言》检测点,实验,课后题答案
- 数据库实验题答案
- 实验五数据库完整性 课外练习题答案
- 鸟哥的Linux私房菜基础学习篇(第二版)第一章课后习题与答案
- WinCE实验教程之一嵌入式系统简介
- 鸟哥的Linux私房菜基础学习篇(第二版)第六章课后习题与答案
- 鸟哥的Linux私房菜基础学习篇(第二版) 课后习题与答案
- 鸟哥的Linux私房菜基础学习篇(第二版)第四章课后习题与答案
- 计算机系统结构[课后题答案] http://bbs.xiakee.com/Topic.aspx?BoardID=84&TopicID=22
- IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第三章答案
- 数据库上机实验报告三(建立 修改表)