SQl 实验.docx

上传人:b****7 文档编号:23749601 上传时间:2023-05-20 格式:DOCX 页数:16 大小:20.45KB
下载 相关 举报
SQl 实验.docx_第1页
第1页 / 共16页
SQl 实验.docx_第2页
第2页 / 共16页
SQl 实验.docx_第3页
第3页 / 共16页
SQl 实验.docx_第4页
第4页 / 共16页
SQl 实验.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

SQl 实验.docx

《SQl 实验.docx》由会员分享,可在线阅读,更多相关《SQl 实验.docx(16页珍藏版)》请在冰豆网上搜索。

SQl 实验.docx

SQl实验

第七章:

1.查询成绩在80.90之间的记录.

selectstudent.sno,sn,cn,score,deptfromsc,course,student

wherestudent.sno=sc.snoando=o

andscorebetween80and90

2.查询至少有4个同学选修的课程名.

selectcnfromsc,course

whereo=o

groupbyo,cnhavingCOUNT(sno)>=4

3.查询其他系中比信息系所有学生年龄都大的学生名单及年龄,并按年龄降序输出.

方法1:

selectsn,agefromstudent

whereage>(selectMAX(age)fromstudentwheredept='信息')

orderbyagedesc

方法2:

selectsn,agefromstudent

whereage>all(selectagefromstudentwheredept='信息')

anddept<>'信息'orderbyagedesc

4.查询与学生张建国同岁的所有学生的学号,姓名和系别.

selectsno,sn,deptfromstudent

whereage=(selectagefromstudent

wheresn='张建国')andsn<>'张建国'

orderbyagedesc

5.查询选修了两门以上课程的学生名单.

方法1:

selectsnfromstudent,scwherestudent.sno=sc.sno

groupbysc.sno,snhavingCOUNT(cno)>2

方法2:

selectsnfromstudentwheresno=(selectsnofromscgroupbysnohavingcount(*)>2)

6.查询至少有一门课程与张建国选课相同的学生的姓名,课程和系别.

方法1:

selectsn,cn,deptfromstudent,sc,coursewherestudent.sno=sc.snoando=oandoin(selectcnofromscwheresno=(selectsnofromstudentwheresn='张建国'))andsn<>'张建国'

方法2:

selectsn,cn,deptfromstudent,sc,coursewherestudent.sno=sc.snoando=oandoin(selectcnofromstudent,scwherestudent.sno=sc.snoandsn='张建国')andsn<>'张建国'

7.查询成绩比该课程平均成绩高的学生的成绩表

select*fromscsc1wherescore>(selectavg(score)fromscsc2whereo=o)

8.查询选修了课号为01001的课程且成绩高于课程号为01002的课程的学生的姓名,此两门课程的课程名和成绩。

selectsn,cn,scorefromstudent,course,sc

wheresc.sno=student.snoando=o

andsc.snoin(selectsc1.snofromscsc1,scsc2wheresc1.sno=sc2.sno

ando='01001'ando='01002'andsc1.score>sc2.score)

9.查询所有未修01001号课程的学生名单。

方法1:

selectsnfromstudent,scwherestudent.sno=sc.sno

andsc.snonotin(selectsnofromscwherecno='01001')

方法2:

selectsnfromstudentwherestudent.snoin

(selectsc1.snofromscsc1wheresnonotin

(selectsc2.snofromscsc2wherecno='01001'))

10.查询每个学生各门课程的平均成绩和最高成绩,按降序排列输出姓名,平均成绩和最高成绩。

selectsn,AVG(score),MAX(score)fromstudent,sc

wherestudent.sno=sc.snogroupbysc.sno,sn

orderbysndesc,AVG(score)desc,MAX(score)desc

11.查询所有学生都选修了的课程的课程号和课程名。

方法1:

selectcno,COUNT(*)fromscgroupbycno

havingCOUNT(*)=(selectCOUNT(*)fromstudent)

方法2:

selectcno,cnfromcoursewherenotexists(

select*fromstudentwherenotexists(select*fromscwherestudent.sno=sc.snoando=o))

12.查询选修了991102号学生选修了的课程的学生的学号和姓名。

selectsno,snfromstudent

wheresnoin(selectdistinctsnofromscsc1wherenotexists(

select*fromscsc2wheresno='991101'and

notexists(select*fromscsc3whereo=o

andsc1.sno=sc3.sno)))

作业题:

选择不选01002课程学生的学号:

selectsnofromscwheresnonotin(selectsnofromscwherecno='01002')

查询选了01001,没有选01002的学生的学号

selectsnofromscwherecno='01001'andsnonotin(selectsnofromscwherecno='01002')

等同于:

selectsnofromscwherecno='01001'andsnonotin(selectsc1.snofromscsc1wherecno='01002')

查询选了01001,没有选01002的学生的姓名,学号和专业

selectsn,sno,deptfromstudentwheresnoin(

selectsnofromscwherecno='01001'andsnonotin(selectsnofromscwherecno='01002'))

查询选了01001又选了01002的学生的学号:

方法1:

selectsnofromscwherecno='01001'andsnoin(selectsnofromscwherecno='01002')

方法2:

selectsc1.snofromscsc1,scsc2wheresc1.sno=sc2.snoando='01001'ando='01002'

第八章:

习题

1.利用学生姓名查询该生选修的课程名,成绩,以及任课老师姓名。

CREATEPROCEDUREpro_sn@snchar(10)

asselectcn,score,tnfromstudent,sc,course,tc,teacher

wherestudent.sno=sc.snoando=o

andteacher.tno=tc.tnoo=o

ando=oandsn=@sn

declare@snchar(10)

select@sn='王蕾'

execpro_sn@sn

2.查询某系的学生的最大年龄和最小年龄。

createprocedurepro_age@deptchar(10)

asselectmax(age),min(age)fromstudent

wheredept=@dept

declare@deptchar(10)

select@dept='计算机'

execpro_age@dept

3.利用学生的姓名和课程名检索该生该课程的成绩。

createprocedurepro_score@snchar(10),@cnchar(10)

asselectscorefromstudent,sc,course

wherestudent.sno=sc.snoando=oand

sn=@snandcn=@cn

declare@snchar(10),@cnchar(10)

select@sn='张彬'

select@cn='计算机基础'

execpro_score@sn,@cn

4.根据职称查询人数,并给出副教授的人数

createprocedurepro_count@profchar(10)

asselectprof职称,COUNT(prof)人数fromteacher

whereprof=@profgroupbyprof

declare@profchar(10)

select@prof='教授'

execpro_count@prof

5.统计某系某职称的人数,平均年龄,平均工资,最高工资。

加专业和职称时dept专业,prof职称,需用groupby语句

createprocedurepro_n@deptchar(10),@profchar(10)

asselect

count(tno)人数,avg(age)平均年龄,

avg(sal)平均工资,max(sal)最高工资

fromteacher

wheredept=@deptandprof=@prof

declare@deptchar(10),@profchar(10)

select@dept='计算机'

select@prof='讲师'

execpro_n@dept,@prof

6.查询某系的教师人数,平均年龄和学生人数

createprocedurepro_nage@deptchar(10)

asselectdept,COUNT(teacher.dept)教师人数,

avg(age)教师平均年龄

into#afromteacherwhereteacher.dept=@deptgroupbydept

selectdept,COUNT(student.dept)学生人数

into#bfromstudentwherestudent.dept=@deptgroupbydept

select#b.dept系别,教师人数,教师平均年龄,学生人数

from#a,#b

where#a.dept=#b.dept

declare@deptchar(10)

select@dept='计算机'

execpro_nage@dept

7.利用课程名查询选修该课程的学生姓名,系别,成绩,并给出‘程序设计’课程该查询信息。

createprocedurepro_inf@cnchar(10)

asselectsn,dept,scorefromstudent,sc,course

wherestudent.sno=sc.snoando=o

andcn=@cn

declare@cnchar(10)

select@cn='程序设计'

execpro_inf@cn

8.利用教师姓名和课程名检索该教师该任课的课程名,课时数,选课人数,平均成绩,最高成绩,并查询教师‘张雪’的‘微机原理’课程的情况记录。

createprocedurepro_information@tnchar(10),@cnchar(10)

asselectcn课程名,ct课时数,COUNT(sno)选课人数,

AVG(score)平均成绩,MAX(score)最高成绩

fromteacher,sc,course,tc

whereteacher.tno=tc.tnoando=o

ando=oando=oandtn=@tn

andcn=@cngroupbytn,cn,ct

declare@tnchar(10),@cnchar(10)

select@tn='李英'

select@cn='计算机基础'

execpro_information@tn,@cn

9.删除实验1创建的存储过程

dropprocedurepro_sn

10.删除实验3和4创建的存储过程

第九章:

练习

(1)修改学生表里的学号,选课表里的学号也自动修改。

ifobject_id('trigger_s','tr')isnotnull

droptriggertrigger_s

CREATETRIGGERtrigger_s

ONstudentforupdate

AS

BEGIN

declare@sno1char(10),@sno2char(10)

select@sno1=snofromdeleted

select@sno2=snofrominserted

updatescsetsno=@sno2wheresno=@sno1

END

GO

updatestudentsetsno='007'wheresn='张彬'

(2)修改选课表里的学号,则要检查学生表中是否存在与该学号相同的记录,若存在则不许修改,若不存在则可修改。

usejiaoxuedb

ifOBJECT_ID('tri_sc','tr')isnotnull

droptriggertri_s

CREATETRIGGERtri_sc

ONscforupdate

AS

BEGIN

declare@nint,@snochar(10)

select@sno=snofromdeleted

select@n=count(*)fromstudentwheresno=@sno

if@n<>0

rollbacktransaction

END

GO

(3)当插入一个记录或修改成绩时,确保此记录的成绩在0到100之间。

(书上)

usejiaoxuedb

ifobject_id('tri_sc2','tr')isnotnull

droptriggertri_sc2

CREATETRIGGERtri_sc2

ONscforinsert,update

AS

declare@scoreint

select@score=scorefrominserted

if@score>=0and@score<=100

beginprint'输入成功'

return

end

print'成绩不合法'

rollbacktransaction

GO

方法二:

CREATETRIGGERtri_sc2

ONscforinsert,update

AS

declare@scoreint

select@score=scorefrominserted

if@score<0or@score>100

begin

print'成绩不合法'

rollbacktransaction

end

GO

updatescsetscore=19wheresno='001'andcno='01002L'

insertintoscvalues('s9','01001','190')

insertintoscvalues('s9','01001','90')

(4)当从课程表里删除某课程的信息时,同时删除教师选课表和学生选课表里与此课程相关的信息。

usejiaoxuedb

ifOBJECT_ID('tri_c','tr')isnotnull

droptriggertri_c

CREATETRIGGERtri_c

ONcoursefordelete

AS

BEGIN

declare@cnochar(10)

select@cno=cnofromdeleted

deletefromscwherecno=@cno

deletefromtcwherecno=@cno

END

GO

deletefromcoursewherecno='01001'

习题:

(2)在教师表里,男职工年龄不能超过60周岁,女职工职称是教授的年龄不能超过60周岁,其它女职工不能超过55周岁。

ifOBJECT_ID('tri_t','tr')isnotnull

droptriggertri_t

createtriggertri_t

onteacherforinsert,update

asdeclare@sexchar(10),@ageint,@profchar(10)

select@sex=sexfrominserted

select@age=agefrominserted

select@prof=proffrominserted

if(@sex='男'and@age<=60)or(@sex='女'and@prof='教授'and@age<=60)

or(@sex='女'and@prof!

='教授'and@age<=55)

begin

print'输入数据合法'

return

end

print'输入数据不合法'

rollbacktransaction

方法二:

createtriggertri_t

onteacherforinsert,update

asdeclare@sexchar(10),@ageint,@profchar(10)

select@sex=sexfrominserted

select@age=agefrominserted

select@prof=proffrominserted

if(@sex='男'and@age>60)or(@sex='女'and@prof='教授'and@age>60)

or(@sex='女'and@prof!

='教授'and@age>55)

begin

print'输入数据不合法'

rollbacktransaction

end

go

(3)为课程表,教师选课表和学生选课表创建参照完整性:

级联删除和级联修改触发器。

ifOBJECT_ID('tri_3','tr')isnotnull

droptriggertri_3

createtriggertri_3

oncoursefordelete,update

asbegin

declare@cno1char(10),@cno2char(10)

select@cno1=cnofromdeleted

select@cno2=cnofrominserted

if@cno2isnotnull

begin

updatescsetcno=@cno2wherecno=@cno1

updatetcsetcno=@cno2wherecno=@cno1

return

end

deletefromscwherecno=@cno1

deletefromtcwherecno=@cno1

end

go

updatecoursesetcno='008'wherecn='程序设计'

(4)为数据库表创建一个触发器,当职称从讲师晋升为副教授时,岗位津贴自动增加500元,从副教授晋升为教授时,岗位津贴自动增加900元

ifOBJECT_ID('tri_prof','tr')isnotnull

droptriggertri_prof

createtriggertri_profonteacherforupdate

as

begin

declare@prof1char(10),@prof2char(10),@tnochar(10)

select@prof1=proffromdeleted

select@prof2=proffrominserted

select@tno=tnofrominserted

if@prof1='讲师'and@prof2='副教授'

updateteachersetcomm=comm+500wheretno=@tno

if@prof1='副教授'and@prof2='教授'

updateteachersetcomm=comm+900wheretno=@tno

end

updateteachersetprof='教授'wheretno=000001

第十一章:

习题

(3)创建一个函数,要求:

根据学生姓名和课程名查询该生该课程的成绩。

(标量值函数)

usejiaoxuedb

ifOBJECT_ID('fun_t','fn')isnotnull

dropfunctionfun_t

go

CREATEFUNCTIONfun_t

(@snchar(10),@cnchar(10))

RETURNSint

AS

BEGIN

DECLARE@scoreint

SELECT@scor

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 其它考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1