实训七 TransactSQL程序设计.docx
《实训七 TransactSQL程序设计.docx》由会员分享,可在线阅读,更多相关《实训七 TransactSQL程序设计.docx(16页珍藏版)》请在冰豆网上搜索。
实训七TransactSQL程序设计
网络数据库实训报告
日期:
2010年10月22日班级:
09级计算机信息管理
学号
姓名
指导老师
实训地点
成绩
38
庄维瀚
罗小平
教A505
实训项目名称
实训七Transact-SQL程序设计
一、实训目的和要求
1、掌握Transact-SQL中全局变量和局部变量的使用方法;
2、掌握Transact-SQL函数的使用方法;
3、掌握自定义函数的方法;
4、初步掌握Transact-SQL流程控制语句的使用。
二、实训所需仪器、设备
硬件:
计算机
软件:
操作系统WindowsXP、SQLServer2005
三、实训内容
(一)变量的使用
1、全局变量的使用
(1)显示到当前日期和时间为止试图登录SQLServer的次数。
(2)显示SQLServer安装的日期、版本和处理器类型。
2、局部变量的使用
(1)编程实现将student数据库中t_student表的记录个数存入到局部变量,并通过局部变量显示出来。
(2)编程实现将student数据库中t_score表中的分数的最大值和最小值分别存入到两个局部变量,并通过局部变量显示出来。
(二)函数的使用
1、系统函数的使用
(1)显示服务器端计算机的名称
selecthost_name()as‘服务器端计算机名称’
(2)显示用户的数据库用户名
selectuser_name()as‘数据库用户名’
2、字符串函数的使用
(1)显示字符’A’的ASCII码。
(2)显示ASCII码为68的字符。
(3)利用substring、right和len函数,显示t_student表中班级、班内学号、姓名字段的内容。
(参考教材P119例6-23)
3、日期型函数的使用
(1)利用getdate和year函数显示t_student表中的学号、姓名、年龄字段的内容。
(参考教材P121例6-25)
(2)利用month或datepart函数显示t_student表中学号、姓名和出生月份(参考教材P122例6-26)。
(3)显示今天距2003年1月21日相隔的天数。
提示:
selectdatediff(’dd’,'2003-1-21',getdate())AS‘相隔天数’
4、转换函数的使用
(1)利用convert函数查询t_student表中出生年份为1985年的学生信息。
(2)按yy.mm.dd格式显示t_student表中的出生日期。
(3)按dd/mm/yy格式显示t_student表中的出生日期。
(4)按hh:
mi:
ss的格式显示当前时间。
5、数学函数的使用
(1)利用rand函数随机产生一个0到1之间的小数。
(2)利用rand和floor函数随机产生一个0-99之间的整数。
6、用户自定义函数的使用
(1)编写一个用户自定义函数fun_sumscores,要求根据输入的班级号和课程号,求此班此门课程的总分。
(参考教材P125例6-30)
(2)利用上面用户自定义函数fun_sumscores,求t_score表中各个班级的各门课程的总分。
(参考教材P125例6-31)
(3)编写一个用户自定义函数,完成以下功能:
根据两个输入的参数(成绩的上限和下限),求t_score表中满足输入条件的学生人数。
(4)利用上面的用户自定义函数,求t_score表中成绩在60-90分之间的学生人数。
(三)流程控制语句的使用
1、根据t_score表中的考试成绩,查询B04511班学生课程号为10010218的课程的平均成绩,若平均成绩大于75,显示“成绩较理想”,否则显示“成绩不理想”。
利用if语句编写程序实现以上功能。
(参考教材P126例6-32)
2、根据t_score表中B04511班的考试成绩,并根据考试分数输出考试等级。
当分数大于等于90分,输出“优”;当分数在80-90之间,输出“良”;当分数在70至80之间,输出“中”;当分数在60至70之间,输出“及格”;当分数在60分以下,输出“不及格”。
利用case语句编写程序实现以上功能。
(参考教材P129例6-34,不需要输出课程名称)
四、实训步骤
(内容说明:
1.大致的操作步骤;
2.源代码,要标注题号)
1.大致的操作步骤:
(1)右击【数据库】→【附加】→【添加】→选择student.mdf→【确定】
(2)右击【student数据库】→【新建查询】→【在语句编写窗体输入语句】→【执行】→【查询成功】→【检查查询的信息是否正确】
2.源代码:
(一)变量的使用
1.
(1)SELECTGETDATE()AS'当前登陆日期和时间',
@@CONNECTIONSAS'企图登陆次数'
(2)SELECT@@VERSIONAS'当前的SQLServer信息'
2.
(1)declare@RowsReyurnint
set@RowsReyurn=(selectcount(*)fromt_student)
select@RowsReyurnas'记录个数'
(2)declare@maxscorereal,@minscorereal
select@maxscore=max(score),@minscore=min(score)fromt_score
select@maxscoreas'最大值',@minscoreas'最小值'
(二)函数的使用
1.
(1)selecthost_name()as'服务器端计算机名称'
(2)selectuser_name()as'数据库用户名'
2.
(1)selectascii('A')as'字符A的ASCII码'
(2)selectchar('68')as'ASCII码为的字符'
(3)selectsubstring(s_number,1,len(s_number)-2)as'班级',
right(rtrim(s_number),2)as学号,
s_nameas姓名,
sexas性别,
birthdayas出生日期,
polityas政治面貌
fromt_student
3.
(1)SELECTS_NUMBERAS学号,
S_NAMEAS姓名,
SEXAS性别,
YEAR(GETDATE())-YEAR(BIRTHDAY)AS年龄
FROMT_STUDENT
(2)SELECTS_NUMBERAS学号,
S_NAMEAS姓名,
SEXAS性别,
DATEPART(MONTH,BIRTHDAY)AS出生月份
FROMT_STUDENT
(3)SELECTDATEDIFF(day,'2003-1-21',getdate())
AS'今天距离2003年1月21日相隔的天数'
4.
(1)SELECTS_NUMBERAS学号,
S_NAMEAS姓名,
SEXAS性别,
BIRTHDAYAS出生日期,
POLITYAS政治面貌
FROMT_STUDENT
WHERECONVERT(char(40),BIRTHDAY,102)LIKE'1985%'
(2)selectCONVERT(char(40),BIRTHDAY,102)as出生日期fromt_student
(3)selectCONVERT(char(40),BIRTHDAY,103)as出生日期fromt_student
(4)selectCONVERT(char(40),getdate(),108)as当前时间
5.
(1)selectrand(8)as'0到之间的一个小数'
(2)selectfloor(rand(6)*100)as'在至产生一个整数的值'
6.
(1)CREATEFUNCTIONFun_SumScores
(@ClassNameASchar(10),
@CourseNumberASchar(10)
)
RETURNSreal
BEGIN
DECLARE@SumResultASreal
SELECT@SumResult=sum(score)
FROMt_score
WHERESUBSTRING(s_number,1,LEN(s_number)-2)=@ClassName
ANDc_number=@CourseNumber
GROUPBYSUBSTRING(s_number,1,LEN(s_number)-2)
RETURN@SumResult
END
(2)SELECTDISTINCT
班级名称=SUBSTRING(s_number,1,LEN(s_number)-2),
课程名称=t_course.c_name,
总分=dbo.Fun_SumScores(SUBSTRING(s_number,1,LEN(s_number)-2),
t_score.c_number)
FROMt_score,t_course
WHEREt_score.c_number=t_course.c_number
(3)Createfunctionfun_sumren
(@maxlinereal,@minlinereal)
returnsint
begin
declare@personcountasint
select@personcount=count(*)fromt_score
wherescore<=@maxlineandscore>=@minline
return@personcount
end
(4)selectdbo.fun_sumren(60,90)as'60到分的学生人数'
(三)流程控制语句的使用
1.if(selectavg(score)fromt_scorewhereleft(s_number,6)='B04511'
andc_number='10010218')>75
begin
print'B04511班课程的平均成绩较理想!
'
print''
selectavg(score)as平均成绩
fromt_score
whereleft(s_number,6)='B04511'
andc_number='10010218'
end
else
begin
print'B04511班课程的平均成绩不理想!
'
print''
selectavg(score)as平均成绩
fromt_score
whereleft(s_number,6)='B04511'
andc_number='10010218'
end
2.selects_numberas学号,
考试等级=case
whenscore>=90then'优'
whenscore>=80then'良'
whenscore>=70then'中'
whenscore>=60then'及格'
else
'不及格'
end
fromt_score
whereleft(s_number,6)='B04511'
orderbys_number
五、总结与分析
(内容说明:
1.对此次实训原理的归纳;
2.对此次实训过程中出现问题的分析及解决办法;
3.此次实训的收获或体会等)
1.对此次实训原理的归纳:
此次实训主要是掌握Transact-SQL程序语言的设计,通过学习Transact-SQL程序设计,掌握其语言中的各种变量的定义及使用方法、常用的系统函数及使用方法、常用的运算符及其优先级、流程控制语句的种类及用法。
2.对此次实训过程中出现问题的分析及解决办法:
(1)做题的时面对太多的函数等问题,感觉很陌生与不解,总是要经过询问老师,或者看看课本之后,才能将问题解决。
(2)遇到的问题是在用户自定义函数的那部分比较难,自己都想不通,后经问同学和上网查查才知道了,虽然现在基本解决,但还是有疑问的,自己课后会好好想想的。
3.此次实训的收获或体会:
此次实训在同学和老师的帮助下,学习到了这章的知识,在遇到问题的时,要虚心向别人学习,还有要细心,这次对函数的问题比较陌生,要细心的做、细心的记住和区分。
总之,这次遇到的问题是这么多实训最多的,不过最后解决了问题,很欣慰。
我还有细心的记住这些问题和自己所学到的东西。
三、思考题
1、全局变量和局部变量有什么区别?
答:
局部变量必须以标记@作为前缀,局部变量的使用也是先声明,再赋值
全局变量必须以标记@@作为前缀,全局变量由系统定义和维护,我们只能读取,不能修改全局变量的值
2、说明下列字符串函数的作用:
ltrim()rtrim()lower()upper()replicate()reverse()stuff()
substring()str()len()
答:
ltrim()删除数据前面的空格
rtrim()去掉字符串后面的空格
lower()转换成小写字母
upper()把给定的字符串变成大写字母
replicate()按照给定的次数,重复表达式的值
reverse()求反向表达式
stuff()在char_exper1中,把从位置star开始,长度为length的字符串用char_exper2代替
substring()返回指定表达式的一部分
str()把数值变成字符串返回,length是总长度,decimal是小数点右边的位数
len()字符串的长度
3、说明下列日期和时间函数的作用:
dateadd()datediff()datepart()day()getdate()month()year()
答:
dateadd()以datedeprt指定的方式,返回date加上number之和
datediff()以datedeprt指定的方式,返回date2与date1之差
datepart()返回日期date中datepart指定部分所对应的整数值
day()返回指定日期的天数
getdate()返回当前的日期和时间
month()返回指定日期的月份
year()返回指定日期的年份
4、说明下列数学函数的作用:
sqrt()floor()ceiling()rand()round()
答:
sqrt()返回给定值的平方根
floor()返回小于或者等于给定值的最大整数
ceiling()返回大于或者等于给定值的最小整数
rand()返回0和1之间的一个随机数
round()将给定的数值四舍五入到指定的长度
5、说明convert函数的作用。
答:
convert函数允许用户把表达式从一种数据类型转换成另一种数据类型,还允许把日期转换成不同的样式