------------------------------------------陈宇超,仅供参考-------------------------------------------------
下列实验均使用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 |
入学日期 |
日期 |
默认为系统当前日期 |
表C-2 Course表结构
列名 |
说明 |
数据类型 |
约束 |
Cno |
课程号 |
普通编码定长字符串,长度为10 |
主键 |
Cname |
课程名 |
普通编码不定长字符串,长度为20 |
非空 |
Credit |
学时数 |
整型 |
取值大于0 |
Semester |
学分 |
小整型 |
|
表C-3 SC表结构
列名 |
说明 |
数据类型 |
约束 |
Sno |
学号 |
普通编码定长字符串,长度为7 |
主键,引用Student的外键 |
Cno |
课程号 |
普通编码定长字符串,长度为10 |
主键,引用Course的外键 |
Grade |
成绩 |
小整型 |
取值范围为0-100 |
表C-4 Teacher表结构
列名 |
说明 |
数据类型 |
约束 |
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) ) |
本实验均在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) |
下列实验均使用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
利用第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
利用第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
能否成功?为什么?