实验7 Transact-SQL程序设计
- 格式:doc
- 大小:1.23 MB
- 文档页数:11
北华航天工业学院《数据库系统管理》实验报告报告题目:Transact-SQL程序设计作者所在系部:计算机科学与工程系作者所在专业:网络工程作者学号:作者姓名:指导教师姓名:完成时间:2011年9月26日北华航天工业学院教务处制Transact-SQL程序设计一、实验目的1、掌握Transact-SQL语言中注释、局部变量的用法;2、掌握Transact-SQL语言中常用运算符的用法;3、掌握Transact-SQL语言中常用函数的用法;4、掌握Transact-SQL语言中流程控制语句的用法。
二、实验内容(一)附加上次实验所创建的数据库“tb_Library”,并回顾该数据库的数据表信息。
(二)练习Transact-SQL语言中两种注释的用法。
(三)使用系统函数查看SQL Server当前安装的日期、版本和处理器类型,将结果记录在实验报告中。
(四)按要求在数据库“db_Library”上,完成以下功能。
1、编制一个函数fc_avgp,根据输入的图书类别名称,返回该类别图书的平均价格,并输入实参调用该函数。
2、编制一个函数fc_count,返回本月借书的人数,并输入实参调用该函数。
3、定义两个变量分别存放价格上限和下限,根据给定的两个变量的值,返回在该价格范围内的所有图书的信息。
4、定义变量“@tsmc”,将某图书的名称赋值给该变量,查询出该图书的借阅情况。
如果没有读者借阅,则显示“该图书无人借阅”,否则,显示所借读者的编号、姓名。
5、调整图书的库存量,如果原库存量不超过5本,则各增加50%的库存量,并采用向上取整;如果超过5本但不超过10本,则各增加30%的库存量,采用向上取整;如果超过10本但不超过20本,则各增加20%的库存量,并采用向下取整;如果超过20本,则增加10%的库存量,并采用向下取整。
6、判定是否有图书过期未还,如果有,则将所有图书的归还日期增加1个月,直到所有图书的归还日期都大于当前日期或者有图书的归还日期超过了2011年12月31日时停止,然后等待3秒后,显示出所有图书信息。
Transact-SQL程序设计Transact-SQL基本语句1、定义批处理语句语句格式:GO注:一个批处理中任何一条语句有语法错误,整个批处理将不能编译和执行。
2.变量(1) 局部变量声明局部变量语句:DECLARE @<局部变量名> <数据类型>[,…]声明一个datetime类型的局部变量。
DECLARE @date_var datetime声明两个局部变量。
DECLARE @var1 int, @var2 money局部变量赋值语句:SET|SELECT @<局部变量名>=<表达式>用SET语句和SELECT语句为局部变量赋值。
DECLARE @var1 datetime,@var2 char (10)SET @var1 = getdate ()SELECT @var2 = convert (char (10), @var1, 102)用SET语句将查询的结果赋给局部变量,并用SELECT语句显示局部变量的值。
Declare @date_var datetimeSet @date_var= (select min (birthday) from s)SELECT @date_var AS min_birthday局部变量名的命名:首字符为字母,长度不超过128的字母、数字和特殊符号(_、@、#)组成的字符串,并且不能与全局变量同名。
局部变量声明后的值初始化为NULL。
局部变量的作用域仅限于一个批处理中。
(2) 全局变量在SQL Server 2000中,将全局变量改称为函数。
由于这些函数不需要任何参数,所以又称为无参函数。
SQL Server 2000无参函数见表1。
全局变量是SQL Server系统内部变量,以@@开头。
表1:SQL Server 2000无参函数用全局变量查看SQL Server的版本、当前所使用的SQL Server 服务器的名称以及所使用服务的名称等信息。
实验七T_SQL的程序设计一、实验目的1、掌握T_SQL的简单的变量的声明、赋值,输出语句。
2、学生能够编写简单的程序。
二、实验要求使学生了解T_SQL的编程的基础知识,掌握简单的变量的声明、赋值,输出以及流程控制语句。
三、实验环境1、操作系统:WinXp Professional2、数据库:SQL Server 2000个人版四、实验内容和步骤局部变量在程序中通常用来储存从表中查询到的数据,或当作程序执行过程中暂存变量使用。
局部变量必须以“@”开头,而且必须先用DECLARE命令说明后才可使用。
其说明形式如下:DECLARE @变量名变量类型[@变量名变量类型…]在Transact-SQL中不能像在一般的程序语言中一样使用“变量=变量值”来给变量赋值。
必须使用SELECT或SET命令来设定变量的值,其语法如下:SELECT @局部变量=变量值或SET @局部变量=变量值DECLARE 命令用于声明一个或多个局部变量、游标变量或表变量。
在用DECLARE 命令声明之后,所有的变量都被赋予初值NULL。
需要用SELECT 或SET命令来给变量赋值。
变量类型可为系统定义的或用户定义的类型,但不能为TEXT、NTEXT、IMAGE类型。
CURSOR 指明名变量是局部的游标变量。
语法如下:DECLARE {{ @local_variable data_type }| { @cursor_variable_name CURSOR }| { table_type_definition }} [,...n]]例7-1:声明一个长度为10 个字符的变量“id”并赋值10010001declare @id char(10)这个小括号是英文的括号select @id=此处是英文的左单引号…‟10010001‟‟这两个单引号都要英文状态下的左单引号print @id在查询分析器中的结果如图7-1所示。
图7-1简单的赋值语句窗口注意:可以在Select命令查询数据时,在Select命令中直接将列值赋给变量例7-2在屏幕中输出“科技、SQL Server”字样declare @x char(4), @y char(7) 英文状态下的逗号select @x = 'SQL', @y = 'Server'print '科技'print @x +@y在查询分析器中的结果如图7-2所示。
实验七T-SQL语言程序设计实验目的与要求⏹熟练掌握变量的定义和赋值。
⏹熟练掌握用户自定义数据类型定义、使用和删除。
⏹熟练掌握各种运算符。
⏹熟练掌握流程控制语句,尤其是条件语句和循环语句。
⏹熟悉并掌握常用的系统函数。
二、实验内容和步骤1、为提高学生学习动力,学校推出一项举措:根据本年综合测评成绩来确定下一年允许图书借阅本书,综合测评<450 允许借阅3本;综合测评>=450且综合测评<500允许借阅4本;综合测评>=500且综合测评<550允许借阅5本;综合测评>=550允许借阅6本,请在学生表中添加“借阅本数”列存放根据综合测评列生成的信息。
添加“借阅本数”列:ALTER TABLE[ex7].[dbo].[学生]ADD借阅本数INT根据“综合测评”计算“借阅本数”:UPDATE[ex7].[dbo].[学生]SET借阅本数=CASEWHEN综合测评<450 THEN 3WHEN综合测评>=450 AND综合测评<500 THEN 4WHEN综合测评>=500 AND综合测评<550 THEN 5WHEN综合测评>=550 THEN 6END2、创建触发器实现,在向学生表中添加学生或将当前学生的综合测评值变更时,自动在借阅本数列输入相应的值。
--创建触发器CREATE TRIGGER TON学生AFTER UPDATEASDECLARE@OLD_SCORE FLOAT,@NEW_SCORE FLOAT,@BORROW_NUM INT,@ID FLOAT SELECT@OLD_SCORE=综合测评FROM DELETEDSELECT@NEW_SCORE=综合测评,@ID=学号FROM INSERTEDIF UPDATE(综合测评)BEGINUPDATE学生SET借阅本数=CASEWHEN@NEW_SCORE<450 THEN 3WHEN@NEW_SCORE>=450 AND@NEW_SCORE<500 THEN 4WHEN@NEW_SCORE>=500 AND@NEW_SCORE<550 THEN 5WHEN@NEW_SCORE>=550 THEN 6ENDWHERE学号=@IDEND验证:UPDATE学生SET综合测评= 455WHERE学号='1606050228'CREATE TRIGGER T1ON学生AFTER INSERTASDECLARE@NEW_SCORE FLOAT,@BORROW_NUM INT,@ID FLOATSELECT@NEW_SCORE=综合测评,@ID=学号FROM INSERTEDBEGINSET借阅本数=CASEWHEN@NEW_SCORE<450 THEN 3WHEN@NEW_SCORE>=450 AND@NEW_SCORE<500 THEN 4WHEN@NEW_SCORE>=500 AND@NEW_SCORE<550 THEN 5WHEN@NEW_SCORE>=550 THEN 6ENDWHERE学号=@IDENDINSERT INTO[ex7].[dbo].[学生](学号,综合测评)VALUES ('1',425)3、各学院对学生的综合测评进行汇总,其中统计分数在500分以上的学生的人数占学院总人数的百分比。
一、Transact-SQL程序设计1:创建了一个变量@CurrentDateTime,然后将GETDATE()函数的值放在变量中,最后输出@CurrentDateTime变量的值。
DECLARE@CurrentDateTime char(30)SELECT@CurrentDateTime=GETDA TE()SELECT@CurrentDateTime AS'当前的日期和时间'GO2:查询T_STUDENT表,将返回的记录数赋给变量@RowsReturn。
USE STUDENTGODECLARE@RowsReturn intSET@RowsReturn=(SELECT COUNT(*)FROM T_STUDENT)SELECT@RowsReturn AS'SELECT 返回的记录数'GO3:在SELECT语句中使用由SET赋值的变量。
USE STUDENTGODECLARE@StuSex char(2)SET@StuSex='女'SELECT S_NUMBER,S_NAME,SEX,BIRTHDAYFROM T_STUDENTWHERE SEX=@StuSexGO4:在T_SCORE表中,求05541班学生高等数学课程的最高分和最低分的学生信息,包括学号、姓名、课程名、成绩四个字段。
USE STUDENTGODECLARE @MaxScore real,@MinScore realSELECT @MaxScore = MAX(SCORE),@MinScore = MIN(SCORE)FROM T_SCORE,T_COURSEWHERE T_SCORE.C_NUMBER=T_COURSE.C_NUMBERAND SUBSTRING(T_SCORE.S_NUMBER,1,5)='05541'AND T_COURSE.C_NAME='高等数学'SELECT T_SCORE.S_NUMBER,S_NAME,C_NAME,SCORE FROM T_STUDENT,T_COURSE,T_SCOREWHERE T_STUDENT.S_NUMBER=T_SCORE.S_NUMBERAND T_SCORE.C_NUMBER=T_COURSE.C_NUMBERAND (SCORE=@MaxScoreORSCORE=@MinScore)GO5:计算表达式的值,并将结果赋给变量@ExpResult。
Transact_SQL程序设计●注释符●块语句[BEGIN….END]●判断语句●IF EXISTS语句●CASE语句●循环语句WHILE●跳转语句GOTO●事务处理语句WAITFOR●PRINT语句●RETURN语句●关于错误处理一、注释符注释符是对程序的说明。
可使用两类注释符:1.两个连字符构成的注释符“--”,用于单行注释2.“/*…*/”用于多行注释。
二、块语句[BEGIN….END]1.语法:BEGIN<SQL 命令行或程序块>END2.说明:·[BEGIN….END] 最常见的用法是和WHILE和IF….ELSE组合使用·在[BEGIN….END]中可嵌套另外的[BEGIN….END]定义另一个程序块三、判断语句1.语法:IF <条件表达式><SQL 命令行或语句块>[ELSE<SQL语句行或语句块>]]2.说明:·条件表达式何以是各种表达式的组合,值必须是逻辑值“真”或“假”·ELSE子句是可选的,最简单的IF语句没有ELSE子句·IF….ELSE 语句可以嵌套[例1]:求三个整数中的最大值DECLARE @a int,@b int,@c int,@max intSELECT @a=1,@b=2,@c=3IF @a>@b AND @a>@cSET @max=@aELSEIF @b>@a AND @b>@cSET @max=@bELSESET @max=@cSELECT @max AS ‘最大值’四、IF EXISTS语句用于检测数据是否存在。
1.语法IF [NOT] EXISTS(SELECT子查询)<SQL 命令行或语句块>[ELSE<SQL 命令行或语句块>]2.说明·SQL服务器只要找到第一个匹配的行(记录),就停止执行SELECT子查询语句·IF 语句最多嵌套150层[例2]:判断高静是否在计算机系IF EXISTS(SELECT * FROM 学生表 WHERE 姓名=‘高静‘ AND 所在院系=‘计算机’)SELECT ‘高静在计算机系’ELSESELECT ‘高静不在计算机系’五、CASE语句用n个条件来控制n个操作1.CASE语句主要是用来取代嵌套的IF语句CASE 语句有两种格式:[格式1]CASE <算术表达式>WHEN <算术表达式> THEN <算术表达式>……WHEN <算术表达式> THEN <算术表达式>[ELSE <算术表达式>]END[格式2]CASEWHEN <条件表达式> THEN <算术表达式>……WHEN <条件表达式> THEN <算术表达式>[ELSE <算术表达式>]END2.CASE语句可以嵌套到任何SQL语句中[例3]:调整学生的成绩。
西北师范大学计算机科学与工程学院学生实验报告2、利用现有的表生成新表,新表中包括学号、学生姓名、课程名称和总评成绩(其中:总评成绩=final*0.9+usually*0.1)。
SQL代码:use teachinggoselect student.studentno as'学号', sname as'学生姓名', cname as'课程名称',0.9*final+0.1*usually as'总评成绩'into new_stuscorefrom student, score, coursewhere student.studentno = score.studentno and course.courseno = score.coursenogoselect*from new_stuscore实验结果:3、分别统计每个学生期末成绩高于75分的课程门数SQL代码:use teachinggoselect student.studentno ,student.sname,count(*)as'课程门数' from score,studentwhere final > 75 and student.studentno = score.studentno group by student.studentno,student.sname实验结果:4、输出student表中年龄大于女生平均年龄的男生的所有信息SQL代码:use teachinggoselect*from studentwhere sex='男'anddatediff(year,birthday,getdate())>(select avg(datediff(year,birthday,getdate()))from studentwhere sex='女')实验结果:5、计算每个学生获得的学分。
实验7 Transact-SQL程序设计富春山居一、实验目的1.掌握Transact-SQL的数据类型、常量变量、表达式等概念。
2.掌握程序中注释的基本概念和使用方法。
3.掌握程序中的流程控制语句。
4.掌握SQL Server 2000中常用函数的用法。
5.掌握游标的概念和声明方法,以及使用游标进行数据的查询、修改、删除操作等。
二、实验准备1.了解程序中注释的语法格式。
2.了解程序中的流程控制语句:IF-ELSE、CASE、WHILE等控制流语句。
3.了解系统提供的常用数学函数、日期和时间函数、字符串函数和数据类型转换函数的用法。
4.了解函数的使用方法。
5.了解游标的使用方法。
三、实验内容和步骤0. 创建studentsdb数据库及其相应表,并录入数据。
启动查询分析器,运行下面链接的代码即可。
创建数据库代码1.在查询分析器中,选择studentsdb数据库,输入以下代码。
DECLARE@stu name varchar(10)SELECT@stu name=姓名FORM student infoWHERE 姓名LIKE ‘张%’SELECT@stu name观察显示的结果,与student info表中数据进行比较,@stu name赋值的是SELECT结果集中的哪个数据赋值的是结果集中的姓张的数据2.定义int型局部变量@grademax、@grademin、@gradesum,在grade表中查找最高分、最低分和总分,分别赋给@grademax、@grademin和@gradesum,并显示。
DECLARE@grademax int,@gradesum,intSELECT@grademax = max(分数),@grademin = min(分数),@gradesum = sum(分数)FROM gradeSELECT @ grademax ,@grademin,@gradesum3.使用SET命令将查询的结果数目赋值给int型局部变量@row。
7.Transact-SQL程序设计所谓“程序设计”就是学习如何以合理的方式将一系列的命令结合起来。
7.1. 使用SQL查询分析器7.2. Transact-SQL的组成元素SQL语言不具备创建窗体、菜单等的能力,SQL Server扮演一个后台数据库的角色,客户端的开发工具可以选择.NET、Java、VB、VC、Delphi等。
Transact-SQL的组成元素:数据定义语言(Data Definition Language,DDL)数据操作语言(Data Manipulation Language,DML)数据控制语言(Data Control Language,DCL)系统存储过程(System Stored Procedure)其它组成元素数据定义语言DDL:用来定义和管理数据库及其所含种类对象的语句。
DDL的形式:CREATE object_nameALTER object_nameDROP object_name数据操作语言DML:用来查询、添加、修改、删除数据库中数据的语句。
DML的种类:SELECTINSERTUPDATEDELETE数据控制语言DCL:用来设置或更改数据库用户或角色权限的语句。
DCL的种类:GRANTDENYREVOKE系统存储过程系统存储过程存放在系统数据库master中且名称以sp_开头,如sp_addtype、sp_rename 等。
回忆一下先前讲过的sp_addtype系统存储过程其它组成元素注释局部变量运算符函数流程控制语句7.3. 常量字符串常量示例:‘电子信息工程系’‘处理中,请稍后…’‘输入值必须介于3000~10000’如果字符串中包含单引号,可以用两个单引号表示字符串本身内嵌的单引号⏹如:'It''s legs are long'U n i c o d e字符串常量必须以大写的字母N作为前缀,如:N’Michaё’,Unicode数据的每一个字符使用2个字节存储。
实验7 Transact-SQL程序设计
一、实验目的
1.掌握Transact-SQL的数据类型、常量变量、表达式等概念。
2.掌握SQL Server 2005中常用函数的用法。
3.掌握程序中注释的基本概念和使用方法。
4.了解程序中的流程控制语句。
二、实验准备
1.了解函数的使用方法。
2.了解系统提供的常用数学函数、日期和时间函数、字符串函数和数据类型转换函数的用法。
3.了解程序中注释的语法格式。
4.了解程序中的流程控制语句:IF-ELSE、CASE、WHILE等控制流语句。
三、实验内容和步骤
1.在查询分析器中,选择studentsdb数据库,在学生表中查找姓“张”的学生,并将该生姓名赋于变量@stu_name。
提示:首先要定义变量@stu_name。
2.定义int型局部变量@grademax、@grademin、@gradesum,在成绩表中查找课程编号是“C002”课程的最高分、最低分和总分,分别赋给@grademax、@grademin和@gradesum,并显示。
3. 使用SET命令将查询结果集记录数目赋值给int型局部变量@row。
给下面代码中的划线处填上适当的内容,以完成上述操作。
DECLARE @rows____int_______
SET _____@rows _______=(SELECT COUNT(*)FROM 成绩表)
_____ SELECT ______@rows --显示@rows的值
4.以下代码在课程表中插入新记录:
DECLARE @intCId int,@intErrorCode int
INSERT INTO 课程表(课程编号,课程名称,学分)
VALUES('0006','VB程序设计',2)
SELECT @intCId=@@identity,@intErrorCode=@@error
SELECT @intCId,@intErrorCode
将该代码段连续执行两次,观察两次显示的信息及课程表中数据的变化,为什么前后两次执行时显示的信息会不同?
提示:@@identity,@@error参看教材P172 表9-2
生和女生人数。
6.在成绩表中,使用适当函数找出“高等数学”课程的最高分、最低分和平
均分,并分别赋予@grademax、@grademin、@gradesum。
7.定义一个datetime型局部变量@studate,以存储当前日期。
计算学生表中的学生的年龄,并显示学生的姓名、年龄。
在以下代码的划线部分填人适当内容,以实现上述功能。
DECLARE___@studate ____ datetime
SET @studate=______ GETDATE()_____ --给@studate赋值为当前日期
SELECT 姓名,___ YEAR(GETDATE())-YEAR(出生日期)______ AS 年龄
FROM 学生表
提示:计算年龄可参考教材表9-9和9-10相关函数。
8.请用单行注释将下列命令行所实现的功能予以注释(填入括号内)。
( --查找学生表中姓陈的人的姓名与家庭住址)
SELECT 姓名, 家庭地址
FROM 学生表
WHERE 姓名 LIKE '陈%‘
9.请用多行注释将下列命令行所实现的功能予以注释(填入括号内)。
( /*查找学生表中80后学生的姓名、性别、出生年月和家庭住址情况
*/ )
SELECT 姓名, 性别,出生年月,家庭地址
FROM 学生表
WHERE YEAR(出生年月)>80
10.在局部变量@stu_id记中存储了学号值。
编写代码查询学号为0001的学生的各科平均成绩,如果平均分>=60则显示“你的成绩及格了,恭贺你!!”,否
则显示“你的成绩不及格”。
11.运行以下代码段,写出运行的结果。
12.编写程序查询成绩表。
如果分数大于等于90,显示优秀;如果分数大于等于80小于90显示良好;如果分数大于等于70小于80显示中等;如果分数大于等于60小于70显示及格,其他显示不及格。
13.计算grade表的分数列的平均值。
如果小于80,则分数增加其值的5%;如果分数的最高值超过95,则终止该操作。
在以下代码划线处填入适当的内容以完成上述功能。
WHILE(SELECT A VG (分数)FROM成绩表)<80
BEGIN
UPDATE成绩表
SET分数=分数*1.05
IF(SELECT MAX(分数)FROM成绩表)>95
BREAK
ELSE
CONTINUE
END
四、实验思考
1.编写代码计算并显示@n=1+2+3+ (20)
代码:DECLARE @s int,@n int,@t int,@c int
SET @n=0
SET @s=1
SET @c=1
SET @t=0
WHILE @s<=20
BEGIN
SET @t=@t+ @c
SET @c=@c + 1
SET @s=@s+1
END
SET @n=@n+@t
SELECT @n
2.区分局部变量与全局变量的不同,思考全局变量的用处。
答:局部变量使用DECLARE语句定义,仅存在于声明它的批处理、存储过程或触发器中,处理结束后,存储在局部变量中的信息将丢失。
通常局部变量的首字母为单个@。
全局变量不能由用户定义,也不能被应用程序用来在处理器之间交叉传递信息,不能显示地被赋值或声明。
全局变量由系统维护,名称前常加@@符号。
全局变量的作用:通常被服务器用来跟踪服务器范围和特定会话期间的信息。
数据库技术与应用实验实验7 Transact-SQL程序设计南京师范大学中北学院11。