数据库查询资料
- 格式:doc
- 大小:141.50 KB
- 文档页数:15
一、 视图的创建:
1.创建计算机科学系学生信息的视图C_student
use xsgl
go
create view c_student
as
select sno,sname,ssex,birth,depart,dname from student s join department d on
s.depart=d.deno
where dname='计算机科学系'
2. 创建计算机科学系选修了ZB171401号课程的学生的视图C_course:
use xsgl
go
create view c_course
as
select s.sno,sname,ssex,birth,depart,dname,cno from student s join department
d on s.depart=d.deno
join sc on sc.sno=s.sno
where dname='计算机科学系' and cno='ZB171401'
3. 建立计算机科学系选修了ZB171401号课程且成绩在90分以上的学生的视图:
use xsgl
go
create view c_course
as
select s.sno,sname,ssex,birth,depart,dname,cno,grade from student s join
department d on s.depart=d.deno
join sc on sc.sno=s.sno
where dname='计算机科学系' and cno='ZB171401'and grade>90
4. 创建一个反映学生出生年份的视图:
use xsgl
go
create view s_year
as
select sno,sname,datepart(yyyy,birth) 出生年份from student
5. 将所有女生的记录定义为一个视图:
use xsgl
go
create view s_women
as
select *from student where ssex='女'
6. 将所有学生的学号和他的平均成绩定义为一个视图S_G:
use xsgl
go
create view S_G as
select S.sno ,avg(grade) 平均分from student S join sc on sc.sno=s.sno
group by S.sno
二、 视图结构的修改:
6. 将视图C_student修改为计算机科学系的所有女生的视图
use xsgl
go
ALTER view c_student
as
select sno,sname,ssex,birth,depart,dname from student s join department d on
s.depart=d.deno
where dname='计算机科学系' AND SSEX='女'
三、查询视图
7. 在计算机科学系的学生视图c_student中查询年龄小于22岁的学生:
use xsgl
go
select datediff(yy,birth,getdate()) as 年龄
from C_student
where datediff(yy,birth,getdate())<22
8. 查询计算机科学系选修了ZB171401号课程的学生:
use xsgl
go
SELECT * from c_course
9. 在视图S_G中查询平均成绩在90分以上的学生的学号和平均成绩:
select *
from S_G
where 平均分> 90
四、更新视图:
10.将计算机科学系学生视图C_student中学号为”061713101”的学生姓名改为”刘辰”:
use xsgl
go
update C_student
set sname='刘辰'
where sno='061713101'
比较: update C_Student set sname=‟刘辰‟ where sno=‟091714150‟ 此语句不能实现数据的更新.
(为什么呢? 因为在视图中并没有” 091714150”这条记录)
11. 向计算机科学系学生视图C_Student中插入一个新的学生记录, 学号为091714145,姓名为”赵新”, 出生日期为1991-1-2:
此操作能成功吗?
不能成功,格式不匹配,INSERT 语句与FOREIGN KEY 约束"FK_Student_Department"冲突。该冲突发生于数据库"xsgl",表"dbo.Department", column 'Deno'。
12. 删除计算机科学系学生视图C_Student中学号为091714145的学生的记录:
use xsgl
go
delete from c_student
where sno='091714145'
五、删除视图:
13. 删除视图S_G:
Use xsgl
go
drop view s_g
思考:
1. 创建所有学生的基本信息和选课信息的视图
Select view s_sc as select student.* cno, grade from student, sc where student.sno=sc.sno
2. 基于上述视图查询各系学生各门功课的平均成绩.
Select sdept, cno, avg(grade) as avg_grade from s_sc group by cno, sdept.
1、使用XSGL数据库中适当的表,创建一个自定义函数—kccj,该函数可以根据输入的学生姓名返回该学生选修的课程名称和成绩。并调用该函数。
create function kcci(@sname varchar(10))
returns table
as
return (
select sname,s.sno,cname,grade from student s join
sc on sc.sno=s.sno join
course c on o=o
where sname=@sname
)
go
select * from kcci('张三')
go
2、使用XSGL数据库中适当的表,创建一个自定义函数—xbxs,该函数可以根据输入的系部名称返回该系学生的学号、姓名和出生日期。并调用该函数。
create function xbxs(@dname varchar(20))
returns table
as
return (
select sname,s.sno,birth from student s join
department d on d.deno=s.depart
where dname=@dname
) go
select * from xbxs('计算机科学系')
go
3、使用系统存储过程sp_helptext查看kccj函数的文本信息。
sp_helptext kcci
4、修改kccj函数,使该函数根据输入的学生学号返回该学生的姓名、选修课程名称和成绩。
alter function kcci(@sno char(9))
returns table
as
return (
select sname,cname,grade from student s join
sc on sc.sno=s.sno join
course c on o=o
where sno=@sno
)
Go
5、删除xbxs函数。
drop function xbxs
6、自定义一个函数,其功能是将一个百分制的成绩按范围转换为“优秀”,“良好”,“通过”,“不及格”。并调用该函数。
CREATE FUNCTION sc_pass
(@grade1 int)
RETURNS CHAR(8)
AS
BEGIN
DECLARE @info char(8)
IF @grade1>=90 SET @info='优秀'
ELSE IF @grade1>=75 SET @info='良好'
ELSE IF @grade1>=60 SET @info='通过'
ELSE SET @info='不通过'
RETURN @info
END
select dbo.sc_pass(95)
7、定义一个内嵌表值函数,通过课程名、系名称可以查询某系中选修了该课程的全部学生名单和成绩。并调用该函数。
CREATE FUNCTION D_courseG(@dept char(20),@Cna varchar(20))
RETURNS TABLE
AS
RETURN (SELECT Sname,Cname,Grade FROM Student S,SC,Course C
WHERE S.Sno=SC.Sno AND o=o AND Depart=@dept AND @Cna=ame)
GO
Select * from d_courseg('17','操作系统')
8、创建自定义函数top_grade( ),根据输入的系代码统计出该系平均成绩最高的前三名同学的信息。并调用