您的位置:首页 > 数据库

数据库系统教程(第二版何玉洁)课后数据库上机实验答案

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

入学日期

日期

默认为系统当前日期

表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)
)
 

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

能否成功?为什么?

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息