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