实验1~8:SQL Server 2008的安装及管理工具的使用、SQL Server数据库的管理、SQL Server数据表的管理、数据查询、索引和视图、数据完整性、Transact-SQL程序设计、存储过程和触发器。(都只要做红字部分)
百度文库里都有这些实验报告,不过我还是想放一下我自己截的图,上传后就一律把实验报告们统统删除了。
学校电脑用SQL Server2008和快速截图可执行文件ScrToPic,实验配套数据库文件:https://download.csdn.net/download/qq_41587612/12154835
实验一 SQL Server 2008的安装及管理工具的使用
1.实验目的
(1)了解SQL Server 2008安装对软、硬件的要求,掌握安装方法。
(2)了解SQL Server的注册和配置方法。
(3)了解SQL Server 2008包含的主要组件及其功能。
(4)熟悉SQL Server 2008管理平台的界面及基本使用方法。
(5)了解数据库及其对象。
(6)了解在SQL Server管理平台中执行SQL语句的方法。
2.实验内容及步骤(实验一真正的内容老师上课讲)
(1)根据软、硬件环境的要求,安装SQL Server 2008(在安装过程中,请选择安装示例数据库AdventureWorks);安装过程见附录1。
(2)通过选择“开始”→“程序”→Microsoft SQL Server 2008→“配置工具”→SQL Server Configuration Manager菜单项,打开“SQL Server配置管理器”窗口,在界面左边的树目录中选择“SQL Server 2008 服务”,在右边的项列表区中选择SQL Server。并且通过该窗口“启动服务”和“停止服务”图标来启动和停止SQL Server服务。
(3)通过“开始”→“程序”→Microsoft SQL Server 2008→SQL Server Management Studio菜单项打开SQL Server管理平台。
(4)在SQL Server管理平台中,注册服务器。查看本地已注册的SQL Server。查找网络上另一台计算机,并且注册该机上的SQL Server,注册时使用“Windows身份认证”或“SQL Server身份认证”的连接方式。
(5)从SQL Server管理平台中删除网络SQL Server服务器。
(6)在SQL Server管理平台的对象资源管理器中打开本地服务器的属性对话框,查看以下信息:产品名称、主机操作系统、产品的版本、操作平台、主机内存等。
(7)利用SQL Server管理平台访问系统自带的AdventureWorks数据库(如何安装AdventureWords2008R2演示数据库,见附录2)。
① 以系统管理员身份登录到SQL Server管理平台。
② 在SQL Server管理平台的对象资源管理器窗口中找到AdventureWorks数据库并展开,查看该数据库的所有对象,如表、视图、存储过程、默认和规则等。
③ 选择AdventureWorks数据库的“表”选项,在右窗格中将列出AdventureWorks数据库的所有表,选择雇员表HumanResources.Employee,右击鼠标,弹出快捷菜单,从中选择“打开表”菜单项,打开Employee表,查看其内容。
(8)利用SQL Server管理平台的查询设计器窗口访问AdventureWorks数据库的表。
① 在SQL Server管理平台的对象资源管理器窗口中,选择AdventureWorks数据库结点,单击鼠标右键,在弹出的快捷菜单中选择“新建查询”命令,或者选择数据库后,单击工具栏的“新建查询”命令,打开查询设计器窗口。
② 在查询设计器窗口中,输入以下代码:
SELECT *
FROM HumanResources.Employee a
WHERE a.Gender='M'
ORDER BY a.Title
③ 选择SQL Server管理平台的“查询”→“分析”菜单项,或者单击常用工具栏上“验证SQL语法”按钮,查询设计器将对输入的代码进行语法分析,并由消息窗格给出分析结果报告。
④ 选择SQL Server管理平台的“查询”→“执行”菜单项,或者单击常用工具栏上“执行SQL”按钮,SQL Server将编译窗口中的代码,并在结果窗格中显示查询结果,如图1-1所示。
(9)同学自己创建的数据库,通过数据库的分离与附加操作,存盘到移动存储中(U盘等),方法见附录3。
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
3.实验思考
(1)SQL Server管理平台的作用是什么?如何进入SQL Server管理平台?
(2)SQL Server配置管理器的作用是什么?如何进入SQL Server配置管理器?
(3)用几种不同的方法实现注册数据库服务器与对象资源管理器的连接。
(4)查询设计器窗口的作用是什么?如何打开查询设计器窗口?
(5)改变查询设计器的当前数据库使用什么方法?
实验二 SQL Server数据库的管理
1.实验目的
(1)了解SQL Server 数据库的逻辑结构和物理结构的特点。
(2)掌握使用SQL Server管理平台对数据库进行管理的方法。
(3)掌握使用Transact-SQL语句对数据库进行管理的方法。
2.实验内容及步骤
(1)在SQL Server管理平台中创建数据库。
① 运行SQL Server管理平台,在管理平台的对象资源管理器中展开服务器。
② 右击“数据库”项,在快捷菜单中选择“新建数据库”菜单项。在新建数据库对话框的数据库名称文本框中输入学生管理数据库名studentsdb,单击“确定”按钮。
(2)选择studentsdb数据库,在其快捷菜单中选择“属性”菜单项,查看“常规”、“文件”、“文件组”、“选项”、“权限”和“扩展属性”等页面。
(3)打开studentsdb数据库的“属性”对话框,在“文件”选项卡中的数据库文件列表中修改studentsdb数据文件的“分配的空间”大小为2MB。指定“最大文件大小”为5MB。修改studentsdb数据库的日志文件的大小在每次填满时自动递增5%。
(4)单击“新建查询”打开查询设计器窗口,在查询设计器窗口中使用Transact-SQL语句CREATE DATABASE创建studb数据库。然后通过系统存储过程sp_helpdb查看系统中的数据库信息。
(5)在查询设计器中使用Transact-SQL语句ALTER DATABASE修改studb数据库的设置,指定数据文件大小为5MB,最大文件大小为20MB,自动递增大小为1MB。
(6)在查询设计器中为studb数据库增加一个日志文件,命名为studb_Log2,大小为5MB,最大文件大小为10MB。
(7)使用SQL Server管理平台将studb数据库的名称更改为student_db。
(8)使用Transact-SQL语句DROP DATABASE删除student_db数据库。
(9)在SQL Server管理平台中删除studentsdb数据库。
3.实验思考
(1)数据库中的日志文件是否属于某个文件组?
(2)数据库中的主数据文件一定属于主文件组吗?
(3)数据文件和日志文件可以在同一个文件组吗?为什么?
(4)删除了数据库,其数据文件和日志文件是否已经删除?是否任何人都可以删除数据库?删除了的数据库还有可能恢复吗?
(5)能够删除系统数据库吗?
实验三 SQL Server数据表的管理(偷懒了,截图千万别截大图)
1.实验目的
(1)掌握使用SQL Server管理平台和Transact-SQL语句CREATE TABLE和ALTER TABLE创建和修改表的方法。
(2)掌握在SQL Server管理平台中对表进行插入、修改和删除数据操作的方法。
(3)掌握使用Transact-SQL语句对表进行插入、修改和删除数据操作的方法。
(4)了解SQL Server的常用数据类型。
2.实验内容及步骤
(1)启动SQL Server管理平台,在对象资源管理器中展开studentsdb数据库文件夹。
(2)在studentsdb数据库中包含有数据表student_info、curriculum、grade,这些表的数据结构如图1-2至图1-4所示。
(3)在SQL Server管理平台中创建student_info、curriculum表。
(4)在SQL Server管理平台中,将student_info表的学号列设置为主键,非空。
(5)使用Transact-SQL语句CREATE TABLE在studentsdb数据库中创建grade表。
(6)student_info、curriculum、grade表中的数据如图1-5至图1-7所示。
(7)在SQL Server管理平台中为student_info、curriculum、grade表添加数据。
(8)使用Transact-SQL语句INSERT INTO...VALUES向studentsdb数据库的grade表插入数据:学号为0004,课程编号为0001,分数为80。
(9)使用Transact-SQL语句ALTER TABLE修改curriculum表的“课程编号”列,使之为非空。
(10)使用Transact-SQL语句ALTER TABLE修改grade表的“分数”列,使其数据类型为real。
(11)使用Transact-SQL语句ALTER TABLE修改student_info表的“姓名”列,使其列名为“学生姓名”,数据类型为varchar(10),非空。
(12)分别使用SQL Server管理平台和Transact-SQL语句DELETE删除studentsdb数据库的grade表中学号为0004的成绩记录。
DELETE grade WHERE 学号='0004'
(13)使用Transact-SQL语句UPDATE修改studentsdb数据库的grade表中学号为0003、课程编号为0005、分数为90的成绩记录。
UPDATE grade SET 分数= 90
WHERE 学号='0003' AND 课程编号='0005'
(14)使用Transact-SQL语句ALTER...ADD为studentsdb数据库的grade表添加一个名为“备注”的数据列,其数据类型为VARCHAR(20)。
ALTER TABLE grade ADD 备注 VARCHAR(20) NULL
3.实验思考
(1)使用Transact-SQL语句删除在studentsdb数据库的grade表添加的“备注”数据列。
(2)在SQL Server管理平台中,studentsdb数据库的student_info表的数据输入时,如果输入相同学号的记录将出现什么现象?怎样避免该情况的发生?
答: 出现学号重复记录会导致同一学号对应多个不同的学生信息,避免方式:将student_info中的学号设为主键。
(3)已经打开的表能删除吗?
(4)在SQL Server 2008中能将数据表中的字段名和其数据类型同时改变吗?
实验4 数据查询
1.实验目的
(1)掌握使用Transact-SQL的SELECT语句进行基本查询的方法。
(2)掌握使用SELECT语句进行条件查询的方法。
(3)掌握SELECT语句的GROUP BY、ORDER BY以及UNION子句的作用和使用 方法。
(4)掌握嵌套查询的方法。
(5)掌握连接查询的操作方法。
2.实验内容及步骤
(1)在studentsdb数据库中,使用下列SQL语句将输出什么?
① SELECT COUNT(*) FROM grade
② SELECT SUBSTRING(姓名,1,2) FROM student_info
③ SELECT UPPER('kelly')
④ SELECT Replicate('kelly',3)
⑤ SELECT SQRT(分数) FROM grade WHERE 分数>=85
⑥ SELECT 2,3,POWER(2,3)
⑦ SELECT YEAR(GETDATE()),MONTH(GETDATE()),DAY(GETDATE())
(2)在studentsdb数据库中使用SELECT语句进行基本查询。
① 在student_info表中,查询每个学生的学号、姓名、出生日期信息。
② 查询学号为0002 的学生的姓名和家庭住址。
③ 找出所有男同学的学号和姓名。
(3)使用SELECT语句进行条件查询。
① 在grade表中查找分数在80~90范围内的学生的学号和分数。
② 在grade表中查询课程编号为0003的学生的平均分。
③ 在grade表中查询学习各门课程的人数。
④ 将学生按出生日期由大到小排序。
⑤ 查询所有姓“张”的学生的学号和姓名。
(4)对student_info表,按性别顺序列出学生的学号、姓名、性别、出生日期及家庭住址,性别相同的按学号由小到大排序。
(5)使用GROUP BY查询子句列出各个学生的平均成绩。
(6)使用UNION运算符将student_info表中姓“张”的学生的学号、姓名与curriculum表的课程编号、课程名称返回在一个表中,且列名为u_编号、u_名称,如图1-8所示。
(7)嵌套查询。
① 在student_info表中查找与“刘伟平”性别相同的所有学生的姓名、出生日期。
SELECT 姓名,出生日期
FROM student_info
WHERE 性别 =
(SELECT 性别
FROM student_info
WHERE 姓名='刘伟平')
② 使用IN子查询查找所修课程编号为0002、0005的学生学号、姓名、性别。
SELECT 学号,姓名,性别
FROM student_info
WHERE student_info.学号 IN
(SELECT 学号
FROM grade
WHERE 课程编号 IN ('0002','0005'))
③ 列出学号为0001的学生的分数比0002号的学生的最低分数高的课程编号和分数。
SELECT 课程编号,分数
FROM grade
WHERE 学号='0001' AND 分数>ANY
(SELECT 分数 FROM grade
WHERE 学号='0002')
④ 列出学号为0001的学生的分数比学号为0002的学生的最高成绩还要高的课程编号和分数。
(8)连接查询。
① 查询分数在80~90范围内的学生的学号、姓名、分数。
SELECT student_info.学号,姓名,分数
FROM student_info,grade
WHERE student_info.学号=grade.学号 AND 分数 BETWEEN 80 AND 90
② 查询学习“C语言程序设计”课程的学生的学号、姓名、分数。
SELECT student_info.学号,姓名,分数
FROM student_info
INNER JOIN grade ON student_info.学号=grade.学号
INNER JOIN curriculum ON 课程名称='C语言程序设计'
③ 查询所有男同学的选课情况,要求列出学号、姓名、课程名称、分数。
3.实验思考
提示:使用左外连接、右外连接、使用SELECT语句的COMPUTE选项。
(1)查询所有没有选修课程的学生信息,返回结果包括学号、姓名、性别。
(2)在student_info表和grade表之间实现交叉连接。
(3)查询每个学生的所选课程的成绩,并列出学号生成分组汇总行(总成绩)和明细行(各课成绩)。
(4)在查询语句中SELECT、FROM和WHERE选项分别实现什么运算?
(5)在查询的FROM子句中实现表与表之间的连接有哪几种方式?对应的关键字分别是什么?
(6)为grade表添加数据行: 学号为0004、课程编号为0006、分数为76。查询所有课程的选修情况,要求列出课程编号、课程名称、选修人数,curriculum表中没有的课程列值为空。
实验5 索引和视图
1.实验目的
(1)掌握使用SQL Server管理平台和Transact-SQL语句CREATE INDEX创建索引的方法。
(2)掌握使用SQL Server管理平台查看索引的方法。
(3)掌握使用SQL Server管理平台和Transact-SQL语句DROP INDEX删除索引的 方法。
(4)掌握使用SQL Server管理平台和Transact-SQL语句CREATE VIEW创建视图的用法。
(5)了解索引和视图更名的系统存储过程sp_rename的用法。
(6)掌握使用Transact-SQL语句ALTER VIEW修改视图的方法。
(7)了解删除视图的Transact-SQL语句DROP VIEW的用法。
2.实验内容及步骤
(1)分别使用SQL Server管理平台和Transact-SQL语句为studentsdb数据库的student_info表创建主键索引。
(2)使用SQL Server管理平台按curriculum表的课程编号列创建唯一性索引。
(3)分别使用SQL Server管理平台和Transact-SQL语句为studentsdb数据库的grade表的“分数”字段创建一个非聚集索引,命名为grade_index。
CREATE INDEX grade_index ON grade(分数)
(4)为studentsdb数据库的grade表的“学号”和“课程编号”字段创建一个复合唯一索引,命名为grade_id_c_ind。
CREATE UNIQUE INDEX grade_id_c_ind ON grade(学号,课程编号)
(5)分别使用SQL Server管理平台和系统存储过程sp_helpindex查看grade表和student_info表上的索引信息。
sp_helpindex grade
(6) 使用SQL Server管理平台对grade表创建一个聚集索引和唯一索引。
(7)使用系统存储过程sp_rename将索引grade_index更名为grade_ind。
sp_rename 'grade.grade_index','grade_ind','INDEX'
(8)分别使用SQL Server管理平台和Transact-SQL语句DROP INDEX删除索引grade_ind。再次使用系统存储过程sp_helpindex查看grade表上的索引信息。
DROP INDEX grade.grade_ind
(9)在studentsdb数据库中,以student_info表为基础,使用SQL Server管理平台建立名为v_stu_i的视图,使视图显示学生姓名、性别、家庭住址。
(10)在studentsdb数据库中,使用Transact-SQL语句CREATE VIEW建立一个名为v_stu_c的视图,显示学生的学号、姓名、所学课程的课程编号,并利用视图查询学号为0003的学生情况。
(11)基于student_info表、curriculum表和grade表,建立一个名为v_stu_g的视图,视图中具有所有学生的学号、姓名、课程名称、分数。使用视图v_stu_g查询学号为0001的学生的所有课程与成绩,如图1-9所示。
(12)分别使用SQL Server管理平台和Transact-SQL语句修改视图v_stu_c,使之显示学号、姓名、每个学生所学课程数目。
(13)使用Transact-SQL语句ALTER VIEW修改视图v_stu_i,使其具有列名学号、姓名、性别。
ALTER VIEW v_stu_i(学号,姓名,性别)
AS SELECT 学号,姓名,性别 FROM student_info
(14)使用系统存储过程sp_rename将视图v_stu_i更名为v_stu_info。
sp_rename v_stu_i,v_stu_info
(15)利用视图v_stu_i为student_info表添加一行数据:学号为0015、姓名为陈婷、性别为女。
(16)利用视图v_stu_i删除学号为0015的学生记录。
(17)利用视图v_stu_g修改姓名为刘卫平的学生的高等数学的分数为84。
(18)使用Transact-SQL语句DROP VIEW删除视图v_stu_c和v_stu_g。
3.实验思考
(1)是否可以通过视图v_stu_g修改grade表中学号列数据?
(2)比较视图和基表操作表中数据的异同。
(3)可更新视图必须满足哪些条件?
(4)什么是索引?SQL Server 2008中有两种形式的索引:聚集索引和非聚集索引,简单叙述它们的区别?
(5)能否在视图上创建索引?
实验6 数据完整性(规则和约束)
(Rule)规则 就是数据库中对存储在表的列或用户自定义数据类型中的值的规定和限制。规则是单独存储的独立的数据库对象。规则与其作用的表或用户自定义数据类型是相互独立的,即表或用户自定义对象的删除、修改不会对与之相连的规则产生影响。规则和约束可以同时使用,表的列可以有一个规则及多个CHECK 约束。规则与CHECK 约束很相似,相比之下,使用在ALTER TABLE 或CREATE TABLE 命令中的CHECK 约束是更标准的限制列值的方法,但CHECK 约束不能直接作用于用户自定义数据类型。
SQL Server中的约束用来确保系统的完整性。一般约束可以分为:主键约束,外键约束,检查约束,默认约束,唯一约束,非空约束。
1.实验目的
(1)掌握Transact-SQL语句(CREATE RULE、DROP RULE)创建和删除规则的方法。
(2)掌握系统存储过程sp_bindrule、sp_unbindrule绑定和解除绑定规则的操作方法,以及sp_helptext查询规则信息、sp_rename更名规则的方法。
(3)掌握SQL Server管理平台和Transact-SQL语句(CREATE TABLE、ALTER TABLE)定义和删除约束的方法,并了解约束的类型。
2.实验内容及步骤
(1)为studentsdb数据库创建一个规则,限制所输入的数据为7位0~9的数字。
① 复制student_info表,命名为stu_phone,在stu_phone表中插入一列,列名为“电话号码”。完成以下代码实现该操作。
SELECT * INTO stu_phone FROM student_info
ALTER TABLE stu_phone ADD 电话号码 CHAR(7) NULL
stu_phone表结构如图1-10所示。
② 创建一个规则phone_rule,限制所输入的数据为7位0~9的数字。实现该规则的代码为
CREATE rule phone_rule
AS
@phone LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
③ 使用系统存储过程sp_bindrule将phone_rule规则绑定到stu_phone表的“电话号码”列上。实现该操作的代码为
sp_bindrule phone_rule ,'stu_phone.电话号码'
④ 输入以下代码,进行一次插入操作:
INSERT INTO stu_phone(学号,姓名,电话号码) VALUES('0009','王国强','1234yyy')
产生以下出错信息:
消息513,级别16,状态0,第1 行
列的插入或更新与先前的CREATE RULE 语句所指定的规则发生冲突。该语句已终止。冲突发生于
数据库'studentsdb',表'dbo.stu_phone',列'电话号码'。
语句已终止。
试分析: 为什么会产生该出错信息?如果要实现插入操作,应修改INSERT INTO语句中的哪个值?
答:前面的代码将电话号码限制在0~9的七位数字,在插入的时候有y不是数字,应该修改电话号码,使电话号码变成0~9的数字,这样就可以正常进行输入了。
(2)创建一个规则stusex_rule,将其绑定到stu_phone表的“性别”列上,保证输入的性别值只能是“男”或“女”。
(3)使用系统存储过程sp_help查询stusex_rule规则列表,使用sp_helptext查询stusex_rule规则的文本,使用sp_rename将stusex_rule规则更名为stu_s_rule。
(4)解除绑定;删除规则。
① 解除规则的绑定:sp_unbindrule 'stu_phone.电话号码'
②删除stu_s_rule规则。DROP rule phone_rule
(5)在studentsdb数据库中用SQL Server管理平台完成:创建表stu_con,并同时创建约束。
① 创建表的同时创建约束。表结构如图1-12所示。
约束要求如下:
将学号设置为主键(PRIMARY KEY),主键名为pk_sid。
为姓名添加唯一约束(UNIQUE),约束名为uk_name。
alter table 表名
add constraint 约束名 unique (列名)
为性别添加属性值约束(CHECK),约束名为ck_bday,其检查条件为:性别='男' OR 性别='女'。
② 在stu_con表中输入如表1-1所示的数据记录。
分析各约束在插入记录时所起的作用,查看插入记录后表中数据与所插入的数据是否一致?
答:不一致,性别只能是男或女,姓名会去重。
③ 使用ALTER TABLE语句的DROP CONSTRAINT参数项在查询设计器中删除为stu_con表所建的约束。
(6)在SQL Server管理平台完成上,为studentsdb数据库的grade表添加外键约束(FOREIGN KEY),要求将“学号”设置为外键,参照表为student_info,外键名称为fk_sid。
① 使用系统存储过程sp_help查看grade表的外键信息。
② 在grade表中插入一条记录,学号为0100,课程编号为0001,分数为78。观察SQL Server会做何处理,为什么?如何解决所产生的问题?
③ 使用查询设计器删除grade表的外键fk_sid。
3.实验思考
(1)在SQL Server 2008中,可采用哪些方法实现数据完整性?
(2)比较默认对象和默认约束的异同。
(3)可以使用SQL Server管理平台创建规则和默认值对象吗?
(4)在数据库中建立的规则不绑定到数据表的列上会起作用吗?为什么?
(5)请说明唯一约束和主键约束之间的联系和区别。
实验7 Transact-SQL程序设计
1.实验目的
(1)掌握Transact-SQL的数据类型、常量变量、表达式等的概念和使用方法。
(2)掌握程序中注释的基本概念和使用方法。
(3)掌握程序中的流程控制语句的使用方法。
(4)掌握SQL Server 2008中常用函数的用法。
2.实验内容及步骤
说明:在实验报告中,为每条语句写注释,并粘贴程序执行结果。
(1)选择studentsdb数据库,打开新建查询编辑器,输入以下代码。
use studentsdb
DECLARE @stu_name varchar(10)
SELECT @stu_name=姓名
FROM student_info
WHERE 姓名 LIKE '张%'
SELECT @stu_name
go
/*定义长度为10的字符串变量@stu_name,赋予它student_info表中“姓名”的值,输出所有姓名开头为“张”的学生姓名*/
观察显示的结果,与student_info表中数据进行比较,@stu_name赋值的是SELECT结果集中的哪个数据?
(2)定义int型局部变量@grademax、@grademin、@gradesum,在grade表中查找最高分、最低分和总分,分别赋给@grademax、@grademin和@gradesum,并显示。
USE studentsdb
DECLARE @grademax int,@grademin int,@gradesum int
SELECT @grademax=max(分数),@grademin= min(分数),@gradesum=sum(分数)
FROM grade
SELECT @grademax,@grademin,@gradesum
GO
/*定义int型局部变量@grademax、@grademin、@gradesum,将grade表中查找最高分、最低分和总分分别赋值给上述变量,并输出显示*/
(3)使用SET命令将查询结果集记录数目赋值给int型局部变量@row。
USE studentsdb
DECLARE @rows int
SET @rows=(SELECT COUNT(*) FROM grade)
PRINT @rows --显示@rows的值
GO
/*声明int类型的变量rows,将grade表中所有项的数目赋予rows,显示@rows的值*/
(4)以下代码在curriculum表中插入新记录:
USE studentsdb
DECLARE @intCId int, @intErrorCode int
INSERT INTO curriculum(课程编号,课程名称,学分)
VALUES('0006','VB程序设计',2)
SELECT @intCId=@@identity,@intErrorCode=@@error
SELECT @intCId,@intErrorCode
go
/*声明int类型的变量intCId、intErrorCode,向表curriculum中插入一条数据('0006','VB程序设计',2),用select @@identity得到上一次插入记录时自动产生的ID,将发生的错误的数量赋予intErrorCode变量,输出intCId、intErrorCode*/
将该代码段连续执行两次,观察两次显示的信息及curriculum表中数据的变化,为什么前后两次执行时显示的信息会不同?
答:第一次和第二次执行显示的结果是相同的,因为在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。
第一次执行后,curriculum表中添加了一行数据('0006','VB程序设计',2)。第二次执行后curriculum表中又添加了一行该数据。
(5)在studentsdb数据库的student_info表中,以“性别”为分组条件,分别统计男生和女生人数。
(6)在grade表中,使用适当函数找出“高等数学”课程的最高分、最低分和平均分。
(7)定义一个datetime型局部变量@studate,以存储当前日期。计算student_info表中的学生的年龄,并显示学生的姓名、年龄。在以下代码的划线部分填入适当内容,以实现上述功能。
USE studentsdb
DECLARE @studate datetime
SET @studate=getdate() --给@studate赋值为当前日期
SELECT 姓名,year(@studate)-year(出生日期) AS 年龄
FROM student_info
GO
/*声明日期变量datetime,给@studate赋值为当前日期,当前年份减去出生年份作为学生年龄并输出*/
(8)运行以下代码,写出运行结果。
DECLARE @a int,@b int
SET @a=168
SET @b=73
SELECT @a & @b,@a|@b,@a^@b
/*声明int变量a、b,设置a为168,b为73,将a和b进行与、或、非逻辑运算,输出结果*/
(9)在局部变量@stu_id中存储了学号值。编写代码查询学号为0001的学生的各科平均成绩,如果平均分³60,则显示“你的成绩及格了,恭贺你 !!”,否则显示“你的成绩不及格”。
USE studentsdb
DECLARE @@stu_id char(4)
set @@stu_id='0005'
IF ((SELECT AVG(分数) FROM grade WHERE 学号='0001')<60)
PRINT '你的成绩不及格'
ELSE
PRINT '你的成绩及格了,恭贺你!!'
Go
/*在局部变量@stu_id中存储学号值,查询学号为0001的学生的各科平均成绩是否大于等于60,若是则显示“你的成绩及格了,恭贺你 !!”,否则显示“你的成绩不及格”。*/
(10)运行以下代码段,写出运行的结果。
DECLARE @counter int
SET @counter=1
WHILE @counter<10
BEGIN
SELECT '@counter的值现在为: '+CONVERT(CHAR(2),@counter)
SET @counter=@counter+1
END
/*声明int类型变量counter,设置counter为1,以下运算循环9次:将int转为char类型,将counter设为自增,步长为1*/
(11)查询grade表。如果分数大于等于90,显示A; 如果分数大于等于80小于90,显示B;如果分数大于等于70小于80,显示C;如果分数大于等于60小于70,显示D; 其他显示E。在以下代码的划线部分填入适当内容完成上述功能。
USE studentsdb
SELECT 学号,分数,等级=
CASE
WHEN 分数>=90 THEN 'A'
WHEN 分数>=80 AND 分数<90 THEN 'B'
WHEN 分数>=70 AND 分数<80 THEN 'C'
WHEN 分数>=60 AND 分数<70 THEN 'D'
ELSE 'E'
END
FROM grade
GO
/*查询grade表。如果分数大于等于90,显示A; 如果分数大于等于80小于90,显示B;如果分数大于等于70小于80,显示C;如果分数大于等于60小于70,显示D; 其他显示E。*/
(12)计算grade表的分数列的平均值(用求平均数函数avg())。如果小于80,则分数增加其值的5%;如果分数的最高值超过95,则终止该操作。在以下代码划线处填入适当的内容以完成上述功能。
USE studentsdb
WHILE (SELECT AVG(分数) FROM grade)<80
BEGIN
UPDATE grade
SET 分数=分数*1.05
if (SELECT MAX(分数) FROM grade)>95
BREAK
ELSE
CONTINUE
END
GO
/*计算grade表的分数列的平均值(用求平均数函数avg())。如果小于80,则分数增加其值的5%;如果分数的最高值超过95,则终止该操作。*/
(13)编写代码计算并显示@n=1+2+3+…+20。
(14)编写代码计算并显示1~100之间的所有完全平方数。例如,81=92,则称81为完全平方数。
(15)计算1~100以内的所有素数。
3.实验思考
(1)Transact-SQL语言的运算符主要有哪些?
(2)流程控制语句与其他编程语言提供的语句有何差别?
(3)区分局部变量与全局变量的不同,思考全局变量的用处。
(4)什么函数能将字符串前和尾的空格去掉?
实验8 存储过程和触发器
1.实验目的
(1)掌握通过SQL Server管理平台和Transact-SQL语句CREATE PROCEDURE创建存储过程的方法和步骤。
(2)掌握使用Transact-SQL语句EXECUTE执行存储过程的方法。
(3)掌握通过SQL Server管理平台和Transact-SQL语句ALTER PROCEDURE修改存储过程的方法。
(4)掌握通过SQL Server管理平台和Transact-SQL语句DROP PROCEDURE删除存储过程的方法。
(5)掌握通过SQL Server管理平台和Transact-SQL语句CREATE TRIGGER创建触发器的方法和步骤。
(6)掌握引发触发器的方法。
(7)掌握使用SQL Server管理平台或Transact-SQL语句修改和删除触发器。
2.实验内容及步骤
说明:在实验报告中,为每条语句写注释,并粘贴程序执行结果。
(1)在查询设计器中输入以下代码,创建一个利用流控制语句的存储过程letters_print,该存储过程能够显示26个小写字母。
CREATE PROCEDURE letters_print
AS
DECLARE @count int
SET @count=0
WHILE @count<26
BEGIN
PRINT CHAR(ASCII('a')+ @count)
SET @count=@count +1
END
单击查询分析器的“执行查询”按钮,查看studentsdb数据库的存储过程中是否有letters_print。
使用EXECUTE命令执行letters_print存储过程。
USE [studentsdb]
GO
DECLARE @return_value int
EXECUTE @return_value = [dbo].[letters_print]
SELECT 'Return Value' = @return_value
GO
(2)输入以下代码,创建存储过程stu_info,执行时通过输入姓名,可以查询该姓名对应的学生的各科成绩。
CREATE PROCEDURE stu_info @name varchar(40)
AS
SELECT a.学号,姓名,课程编号,分数
FROM student_info a INNER JOIN grade ta
ON a.学号= ta.学号
WHERE 姓名= @name
/*创建存储过程stu_info,通过输入姓名,查询该姓名对应的学生的各科成绩*/
使用EXECUTE命令执行存储过程stu_info,其参数值为“马东”。
USE [studentsdb]
DECLARE @return_value int
EXECUTE @return_value = [stu_info]
@name='马东'
SELECT 'Return Value' = @return_value
GO
/*声明int类型的变量return_value,执行存储过程stu_info,其参数值为“马东”,输出返回值为“马东的所有信息”*/
如果存储过程stu_info执行时没有提供参数,要求能按默认值查询(设姓名为“刘卫平”),如何修改该过程的定义?
(3)使用studentsdb数据库中的student_info表、curriculum表、grade表。
① 创建一个存储过程stu_grade,查询学号为0001的学生的姓名、课程名称、分数。
② 执行存储过程stu_grade,查询0001学生的姓名、课程名称、分数。
③ 使用系统存储过程sp_rename将存储过程stu_grade更名为stu_g。
(4)使用student_info表、curriculum表、grade表。
① 创建一个带参数的存储过程stu_g_p,当任意输入一个学生的姓名时,将从3个表中返回该学生的学号、选修的课程名称和课程成绩。
② 执行存储过程stu_g_p,查询“刘卫平”的学号、选修课程和课程成绩。
③ 使用系统存储过程sp_helptext,查看存储过程stu_g_p的文本信息。
(5)使用student_info表。
① 创建一个加密的存储过程stu_en,查询所有男学生的信息。
② 执行存储过程stu_en,查看返回学生的情况。
③ 使用Transact-SQL语句DROP PROCEDURE删除存储过程stu_en。
(6)使用grade表。
① 创建一个存储过程stu_g_r,当输入一个学生的学号时,通过返回输出参数获取该学生各门课程的平均成绩。
② 执行存储过程stu_g_r,输入学号0002。
③ 显示0002号学生的平均成绩。
(7)输入以下代码,复制student_info表命名为stu2,为stu2表创建一个触发器stu2_tr,当stu2表插入一条记录时,为该记录生成一个学号,该学号为学号列数据的最大值加1。
--复制student_info表命名为stu2
use studentsdb
SELECT * INTO stu2 FROM student_info
GO
/*复制student_info表命名为stu2*/
--为stu2表创建一个INSERT型触发器stu_tr
CREATE TRIGGER stu2_tr
ON stu2 FOR INSERT
AS
DECLARE @max char(4)
SET @max=(SELECT MAX(学号) FROM stu2)
SET @max=@max+1
UPDATE stu2 SET 学号=REPLICATE('0',4-len(@max))+@max
FROM stu2 INNER JOIN inserted on stu2.学号=inserted.学号
GO
/*为stu2表创建一个INSERT型触发器stu_tr,当插入一条记录时,声明char类型变量max,设置max为stu2表中学号的最大值,max加1,为该记录生成一个学号,该学号为学号列数据的最大值加1,插入该条记录*/
执行以上代码,查看studentsdb数据库中是否有stu2表,展开stu2,查看其触发器项中是否有stu2_str触发器。
在查询设计器的编辑窗口输入以下代码
use studentsdb
INSERT INTO stu2(学号,姓名,性别) VALUES('0001','张主','女')
/*在stu2表中插入('0001','张主','女')*/
运行以上代码,查看stu2表的变化情况,为什么插入记录的学号值发生了改变?
答:插入记录S('0001','张主','女'),当插入记录时触发插入触发器,为该记录生成一个学号,该学号为学号列数据的最大值加1。
(8)为grade表建立一个名为insert_g_tr 的INSERT触发器,当用户向grade表中插入记录时,如果插入的是在curriculum表中没有的课程编号,则提示用户不能插入记录,否则提示记录插入成功。在进行插入测试时,分别输入以下数据:
观察插入数据时的运行情况,说明为什么?
(9)为curriculum表创建一个名为del_c_tr的DELETE触发器,该触发器的作用是禁止删除curriculum表中的记录。
(10)为student_info表创建一个名为update_s_tr的UPDATE触发器,该触发器的作用是禁止更新student_info表中的“姓名”字段的内容。
(11)使用Transact-SQL语句DROP TRIGGER删除update_s_tr触发器。
(12)为student_info表建立删除触发器del_s_tr,要求当student_info表的记录被删除后,grade表中相应的记录也能自动删除。