您的位置:首页 > 数据库

《数据库系统》上机题_实验四:T-SQL查询、存储过程、触发器、完整性

2013-11-12 09:05 344 查看
T-SQL查询、存储过程、触发器、完整性

第一部分:T-SQL程序设计

(1).如果3号课程的平均成绩在80分以上,则输出“3号课程成绩良好”,否则输出“3号成绩一般” if (select avg(grade) from sc where cno='3')>80

begin

print '3号成绩良好'

end

else

begin

print '3号成绩一般'

end

(2)计算并输出95003号学生的平均成绩,若无该生信息,则显示“该生未选课”,提示信息.

declare @message varchar(200)

if exists(select sno from sc where sc.sno='95003')

begin select avg(grade) from sc where sc.sno='95003' end

else begin set @message='该生未选课'

print @message end

(3).如果有成绩在90分以上的学生,则显示他的学号,课程和成绩,否则显示“没有学生的课程成绩在90分以上”提示信息

declare @msg varchar(200)

if exists(select grade from sc where sc.grade>=90)

select sno,cno,grade from sc where sc.grade>=90

else

set @msg='没有学生的成绩在90以上'

print @msg

(4).利用游标逐行显示student表中的记录。

declare @cursorvar cursor

set @cursorvar=cursor scroll dynamic for

select* from student

open @cursorvar

fetch next from @cursorvar

while @@fetch_status=0

begin fetch next from @cursorvar end close @cursorvar deallocate @cursorvar

(5).用自定义函数计算全体男生的平均年龄

CREATE FUNCTION average(@cnum char(2)) RETURNS int as

begin declare @aver int

select @aver=(select avg(sage) from student where ssex=@cnum group by ssex)

return @aver

end

go

declare @aver1 int,@cnum1 char(2)

set @cnum1='男'

select @aver1=dbo.average (@cnum1)

select @aver1 as'全体男生的平均年龄'

(6).显示course表中课程名的前2个字符。

select left(cname, 2)

from course

order by cno

(7).在一列中显示student中各元组的学号中的年级,列名显示为“年级”;另一列中显示学号中的学生序列号,列名显示为“序号”。SELECT SUBSTRING(sno, 1,2) '年级', SUBSTRING(sno, 3, LEN(sno)-1) '序号'

FROM student

ORDER BY sno

(8).在选课表中显示学号、课程号,并根据成绩:0-59显示“不合格”;60-79显示“合格”;80-89显示“良好”;90-100显示“优秀。”

select sno,cno,grade=

case

when grade>=0 and grade<60 then '不合格'

when grade>=60 and grade<80 then '合格'

when grade>=80 and grade<90 then '良好'

when grade>=90 and grade<=100 then '优秀'

end

from sc

第二部分:存储过程

(1)创建一个为worker表添加职工记录的存储过程Addworker

CREATE proc Addworker

@职工号 char(4),

@名姓 char(8),

@性别 char(2),

@出生日期 datetime,

@党员否 char(2),

@参加工作 datetime,

@部门号 char(4)

As

insert into worker

values(@职工号,@名姓,@性别,@出生日期,@党员否,@参加工作,@部门号);

(2)创建一个存储过程Delworker删除worker表中指定职工号的记录

create proc Delworker @zhigonghao char(4) as delete from worker where 职工号=@zhigonghao;

go

(3)显示存储过程Delworker的定义信息。

(4)删除存储过程Addworker和Delworker。不要截图

drop procedure Addworker

drop procedure Delworker

(5)创建并执行以下存储过程:

a.从数据库表中查询,返回学生学号、姓名、课程名、成绩

create proc s_back

as

select student.sno,sname,cname,grade

from student,sc,course

where student.sno=sc.sno and sc.cno=course.cno

go

exec s_back

b.从数据库表中查询指定学号的学生学号,姓名、班级,该存储过程接受与传递参数,精确匹配的值

create proc r_back

@a char(10)

as select sno,sname from student where sno=@a

go

exec r_back'95003'

第三部分:触发器

(1) 在表depart上创建一个触发器 depart_update , 当更改部门号时同步更改 worker表中对应的部门号

create trigger depart_update

on depart for update

as

update worker set 部门号=(select 部门号 from inserted)

where worker.部门号=(select 部门号 from deleted)



(2)在表worker上创建一个触发器worker_delete,当删除职工记录时同步删除salary表中对应的职工记录。

create trigger worker_delete

on worker for delete

as delete from salary

where 职工号=(select 职工号 from deleted)

(3) 删除触发器depart_update

drop trigger depart_update

(4) 删除触发器worker_delete

drop trigger worker_delete

(5)在数据库中创建一个触发器,向选课表添加一条纪录时,检查该纪录的学号在学生表中是否存在,检查该纪录的课程号在课程表中是否存在,若其中有一项为否,则拒绝添加操作,并显示“违反数据一致性”提示信息。

例如:向选课表中添加一条记录('95007','2',99),说明95009不在student表中

create trigger sc_insert on sc for insert as

declare @xuehao char(10),@kechenghao char(10),@chengji smallint,@a,@b

select @xuehao=sno,@kechenghao=cno from inserted

set @a= select sno from student where sno=@xuehao

set @b= select cno from course where cno=@kechenghao

if exists(@a and @b)

beign

insert into sc values(@xuehao,@kechenghao,@chengji)

end

rollback transaction print'违反数据一致性'

insert into sc values('95007','2',99)

第四部分:数据库完整性

1、实施worker表的“性别”字段默认值为“男”的约束

alter table worker

add constraint con1 default '男' for 性别

go

例如:

insert worker(职工号) values(111)

select * from worker

2 实施salary表的“工资”字段值在0~9999的约束

create table salary

(职工号 char(4),

姓名 char(8),

日期 datetime,

工资 decimal not null check(工资>=0 and 工资<=9999),

primary key(职工号,日期))

3 实施depart表的“部门号”字段值唯一的非聚集索引的约束
create table depart
(部门号 char(4) unique,
部门名 char(10))
Go
4、为worker表建立外键“部门号”,参考表depart的“部门号”列。

Create table worker
(职工号 char(4) primary key,
姓名 char(8),
性别 char(2),
出生日期 datetime,
党员否 char(2),
参加工作 datetime,
部门号 char(4),
Foreign key(部门号) references depart(部门号))
5、 建立一个规则 sex:@性别=’男’OR @性别=’女’,将其绑定到worker表的“性别”列上。

create rule worker_rule

as @性别 like '男' or @性别 like '女'

go

exec sp_bindrule 'worker_rule', 'worker.性别'

Go

6、删除1小题所建立的约束

Alter table worker drop constraint con1

7、 删除2小题所建立的约束。

Alter table salary drop 工资check

8、 删除3小题所建立的约束

Alter table depart drop unique

9、删除4小题所建立的约束

Alter table worker drop foreign key

10.解除5小题所建立的绑定并删除规则sex

if exists (select name from sysobjects

where name = 'worker_rule' and type = 'R')

begin

exec sp_unbindrule 'worker.性别'

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