SQL数据管理实验指导书2013.6

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一 SQL编程一.实验目的
1.熟练掌握SQL编程方法
2.掌握Transact-SQL基本语法
3.掌握SQL-查询分析器的基本用法
4.掌握SQL中常用统计函数的用法
5.掌握游标的基本用法
二.实验要求
1.回顾SQL语法
2.熟悉SQL Server2000的基本操作
3.预习Transact-SQL基本语法
4.预习游标用法
三.实验内容
1.用统计函数sum、avg、min、max、count等进行查询
2.统计函数结合group by进行查询
3.实现Transact-SQL中的判断和循环结构编程
4.用游标实现一个统计功能
四.实验内容要求
实验任务
1、给学生表增加字段联系电话,为整型
2、改变学生表中字段联系电话字段的属性为字符型
3、删除联系电话字段
4、删除表教师表
5、查询学生表中年龄>20并且是北京来的学生
6、查询各专业学生的人数
7、查询英语成绩大于80分的所有女生
8、查询每个专业的女生人数
9、对各个地区来的学生的总人数按从小到大的顺序排列
10、求各个专业女生数学的平均分
11、求计算机专业的所有李姓的学生
12、用case语句查出若水同学的各门课程的成绩,并按照90以上为优秀80-90为良好;60-80中等,60以下为不及格
13、用插入语句向学生表插入一条记录
要求只插入学号,姓名,地址三个字段的值,1008,德华,香港
14、重新创建一个表结构与学生表相同命名为学生表1,用SQL语句将
学生表中的所有女生,插入到学生表1中
15、取出学生表中备份字段的前20个字符
16、求出年龄大于平均年龄的女生姓名
17、求出数学课程的成绩最高最低分
18、求出各专业英语大于80分学生的人数
19、用IN语句实现找出英语不及格的学生学号和姓名
20 、查出所有学生及其课程成绩,不管该学生有没有选课
实验二表连接及综合查询
一、实验目的与要求
1.掌握表连接查询的使用方法
2.掌握子查询的使用方法
3.能使用内连接、左外连接、右外连接以及交叉连接解决相关问题
4.熟悉系统函数的使用
5.能熟练应用SELECT语句及其相关字句
6.能将SELECT与系统函数、IF ELSE、WHILE等语句进行综合应用并解决相关问题
二、实验内容
(一)连接查询(数据库及表见附件)
1.查找每一个供应商供应的商品的名称,要求显示供应商名称和商品名称。

select Sname,cname from supplier,supplying,commodity
where supplier.Sid=supplying.sid and supplying.cid=commodity.cid
2.使用连接查询查找与姓名为‘李云’的采购员签订采购单的供应商的名称。

select ename,Sname from employee,stock,supplier
where employee.eid=stock.eid and stock.sid=supplier.Sid and ename='李云' 3.使用关键字IN完成查询,要求查找与姓名为‘李云’的采购员签订采购单的供应商的名称。

select Sname from supplier
where sid in
(select sid from employee,stock
where employee.eid=stock.eid and ename='李云')
4.使用左外连接完成如下查询:要求查找所有采购员签订的采购合同的详细信息。

select*from employee left outer join stock on stock.eid=employee.eid
left outer join stockdetail on stockdetail.cgid=stock.cgid
5.使用左外连接完成如下查询:查找所有客户购买的商品详细信息,要求显示客户名称,
商品名称,销售数量,商品单价,没有购买商品的客户也要显示。

select CUname,Cname,SDnumber,price from customer
left outer join sale on sale.CUid=customer.CUid
left outer join saleDetail on saleDetail.SAid=sale.SAid
left outer join supplying on supplying.Cid=saleDetail.Cid
left outer join commodity on commodity.Cid=supplying.Cid
6.请使用内连接完成如下查询:查找每一个供应商供应的商品的种类,要求显示供应商名称,供应的商品的种类。

select sname,COUNT(cid)as商品种类from supplier
inner join supplying on supplier.sid=supplying.sid
group by sname
7.查找购买了编号为‘A001’的供应商供应的商品的客户名称
select cuname from customer,sale,saledetail,supplying,supplier
where customer.cuid=sale.cuid and sale.said=saledetail.said
and saledetail.cid=supplying.cid and supplying.sid=supplier.Sid
and supplier.Sid='A001'
group by cuname
8.查找销售员‘王良’在2005年签订的销售合同的详细信息。

select*from employee,sale,saledetail
where employee.eid=sale.eid and sale.said=saledetail.said
and ename='王良'and YEAR(sadate)=2005
(二)、综合查询
1.查询所有供应‘鲜橙多’的供应商的最低报价。

select sname,MIN(price)as最低价格from supplier,commodity,supplying
where supplier.Sid=supplying.sid and supplying.cid=commodity.cid
and cname='鲜橙多'group by sname
2.查找销售员‘王良’在2005年签订的所有销售合同中每一类商品的总金额。

select cname,SUM(samoney)as总金额from employee,sale,saledetail,commodity
where employee.eid=sale.eid and sale.said=saledetail.said
and saledetail.cid=commodity.cid and ename='王良'and YEAR(sadate)=2005
group by cname
3.汇总由姓名为‘刘明’的采购员在2004年采购的‘数码相机’的总金额。

select cname,SUM(cgmoney)as总金额from employee,stock,stockdetail,commodity where employee.eid=stock.eid and stock.cgid=stockdetail.cgid
and stockdetail.cid=commodity.cid and ename='刘明'
and cname='数码相机'and YEAR(cgdate)=2005
group by cname
4. 汇总由姓名为‘刘明’的采购员在2005年采购的各类商品的数量。

select cname,COUNT(stockdetail.cid)as商品数量from
employee,stock,stockdetail,commodity
where employee.eid=stock.eid and stock.cgid=stockdetail.cgid
and stockdetail.cid=commodity.cid and ename='刘明'and YEAR(cgdate)=2005
group by cname
5. 查找没有供应任何一类商品的供应商的名字。

select sname from supplier
where sid not in
(select supplier.Sid from supplier,supplying where supplier.Sid=supplying.sid) 6. 查找在2006年各个客户购买商品的总金额,要求结果按照购买商品的总金额降序排序
select cuname,SUM(samoney)as总金额from customer,sale,saledetail
where customer.cuid=sale.cuid and sale.said=saledetail.said
and YEAR(sadate)=2006
group by cuname
order by SUM(samoney)desc
7.. 请使用左连接完成以下查询:查找每一个销售人员销售的商品的详细信息,要求显示销售人员姓名、销售单ID、客户姓名、商品名称、销售数量、和销售单价。

select Ename,sale.SAid,CUname,Cname,SDnumber,price from Employee
left outer join sale on sale.Eid=Employee.Eid
left outer join customer on customer.CUid=sale.CUid
left outer join saleDetail on saleDetail.SAid=sale.SAid
left outer join supplying on supplying.Cid=saleDetail.Cid
left outer join commodity on commodity.Cid=supplying.Cid
8.查找每个采购员和每个供应商签订的合同的总金额,要求显示采购员姓名、供应商名称、和签订合同的总金额。

select ename,sname,SUM(cgmoney)as总金额from employee,stock,supplier
where employee.eid=stock.eid and stock.sid=supplier.Sid
group by ename,Sname
三、自我测试
1.使用右外连接完成如下查询:要求查找所有采购员签订的采购合同的详细信息,没有签订采购单的采购员也要显示
select*from sale right outer join Employee on sale.Eid=Employee.Eid
2.查找购买了名称为‘联想集团’的供应商供应的商品的客户名称
select cuname from customer,sale,saledetail,supplying,supplier
where customer.cuid=sale.cuid and sale.said=saledetail.said
and saledetail.cid=supplying.cid and supplying.sid=supplier.Sid
and supplier.Sname='联想集团'
group by cuname
3.查找编号为‘A002’的供应商没有供应的商品的名称
select cname from commodity
where cid not in
(select commodity.cid from commodity,supplying
where commodity.cid=supplying.cid and supplying.sid='A002')
4.分别使用UNION、和INNER JOIN关键字完成以下查询:查询由‘三高计算机公司’和‘联想集团’供应商的所供应商品的商品ID。

select cid from supplier inner join supplying
on supplier.Sid=supplying.sid and Sname='三高计算机公司'
union
select cid from supplier inner join supplying
on supplier.Sid=supplying.sid and Sname='联想集团'
实验三索引、视图SQL的流程控制语句及游标
一.实验目的
1.了解存储过程和触发器的基本作用
2.掌握存储过程和触发器的创建方法
3.掌握存储过程和触发器的运行机制
4.了解常见的系统存储过程
二.实验要求
1.熟悉SQL语法
2.熟练掌握企业管理器管理对象的方法
3.掌握SQL查询分析器的用法
4.了解存储过程和触发器的相关知识
三.试验内容
(一)索引
1、建立与删除[索引]的方法。

在各表中,分别按代理商编号、客户编号、产品编号及订单编号建立索引(索引的类型分别为聚集索引,非聚集索引,普通索引、唯一索引。

2、删除其中两个索引。

(二)视图
1、创建视图的语法
SQL语言用CREATE VIEW命令建立视图,其一般格式为:
CREATE VIEW <视图名>[(<列名>[,<列名>]...)]
AS <子查询>
[WITH CHECK OPTION];
其中子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语。

WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。

如果CREATE VIEW语句仅指定了视图名,省略了组成视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。

2、创建一女学生视图,并对视图进行插入删除修改的操作,理解视图的修改实际是对基表的修改,理解那种情况不可以修改。

3.、创建一学生成绩单视图,视图包括学号姓名,课程号,课程名,成绩
并在此视图上查询江南同学的成绩。

4、查找学生人数最多的专业名称。

5、给成绩单视图加密。

6、在视图女学生创建约束,防止任何用户删除数据。

7、删除视图女学生上的约束限制,使任何用户都可删除该视图上的数据。

8、修改和删除视图女学生。

(三)流程控制语句的使用
编写一个程序实现判断中一个数是不是素数。

(四). 游标的使用
1). 声明游标
在这一步中,需要指定游标的属性和根据要求产生的结果集。

有两种方法可以指定一个游标。

形式1 (ANSI 92)
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE ][OF column_list]}]
形式2
DECLARE cursor_name CURSOR
[LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
FOR select_statement
[FOR {READ ONLY | UPDATE ][OF column_list]}]
INSENSITIVE关键字指明要为检索到的结果集建立一个临时拷贝,以后的数据从这个临时拷贝中获取。

如果在后来游标处理的过程中,原有基表中数据发生了改变,那么它们对于该游标而言是不可见的。

这种不敏感的游标不允许数据更改。

SCROLL关键字指明游标可以在任意方向上滚动。

所有的fetch选项(first、last、next、relative、absolute)都可以在游标中使用。

如果忽略该选项,则游标只能向前滚动(next)。

Select_statement指明SQL语句建立的结果集。

Transact SQL语句COMPUTE、COMPUTE BY、FOR BROWSE和INTO在游标声明的选择语句中不允许使用。

READ ONLY指明在游标结果集中不允许进行数据修改。

UPDATE关键字指明游标的结果集可以修改。

OF column_list指明结果集中可以进行修改的列。

缺省情况下(使用UPDATE关键字),所有的列都可进行修改。

LOCAL关键字指明游标是局部的,它只能在它所声明的过程中使用。

GLOBAL关键字使得游标对于整个连接全局可见。

全局的游标在连接激活的任何时候都是可用的。

只有当连接结束时,游标才不再可用。

FORWARD_ONLY指明游标只能向前滚动。

STATIC的游标与INSENSITIVE的游标是相同的。

KEYSET指明选取的行的顺序。

SQL Server将从结果集中创建一个临时关键字集。

如果对数据库的非关键字列进行了修改,则它们对游标是可见的。

因为是固定的关键字集合,所以对关键字列进行修改或新插入列是不可见的。

DYNAMIC指明游标将反映所有对结果集的修改。

SCROLL_LOCK是为了保证游标操作的成功,而对修改或删除加锁。

OPTIMISTIC指明哪些通过游标进行的修改或者删除将不会成功。

注意:
·如果在SELECT语句中使用了DISTINCT、UNION、GROUP BY语句,且在选择中包含了聚合表达式,则游标自动为INSENSITIVE的游标。

·如果基表没有唯一的索引,则游标创建成INSENSITIVE的游标。

·如果SELECT语句包含了ORDER BY,而被ORDER BY的列并非唯一的行标识,则DYNAMIC游标将转换成KEYSET游标。

如果KEYSET游标不能打开,则将转换成INSENSITIVE游标。

使用SQL ANSI-92语法定义的游标同样如此,只是没有INSENSITIVE关键字而已。

ii. 打开游标
打开游标就是创建结果集。

游标通过DECLARE语句定义,但其实际的执行是通过OPEN 语句。

语法如下:
OPEN { { [GLOBAL] cursor_name } | cursor_variable_name}
GLOBAL指明一个全局游标。

Cursor_name是被打开的游标的名称。

Cursor_variable_name是所引用游标的变量名。

该变量应该为游标类型。

在游标被打开之后,系统变量@@cursor_rows可以用来检测结果集的行数。

@@cursor_rows为负数时,表示游标正在被异步迁移,其绝对值(如果@@cursor_rows 为-5,则绝对值为5)为当前结果集的行数。

异步游标使用户在游标被完全迁移时仍然能够访问游标的结果。

iii. 从游标中取值
在从游标中取值的过程中,可以在结果集中的每一行上来回移动和处理。

如果游标定义成了可滚动的(在声明时使用SCROLL关键字),则任何时候都可取出结果集中的任意行。

对于非滚动的游标,只能对当前行的下一行实施取操作。

结果集可以取到局部变量中。

Fetch命令的语法如下:
FETCH [NEXT | PRIOR| FIRST | LAST | ABSOLUTE {n | @nvar} | RELATIVE {n | @nvar}] FROM [GLOBAL] cursor_name} | cursor_variable_name}
[INTO @variable_name ][,……n]]
NEXT指明从当前行的下一行取值。

PRIOR指明从当前行的前一行取值。

FIRST是结果集的第一行。

LAST是结果集的最后一行。

ABSOLUTE n表示结果集中的第n行,该行数同样可以通过一个局部变量传播。

行号从0开始,所以n为0时不能得到任何行。

RELATIVE n表示要取出的行在当前行的前n行或后n行的位置上。

如果该值为正数,则要取出的行在当前行前n行的位置上,如果该值为负数,则返回当前行的后n行。

INTO @cursor_variable_name表示游标列值存储的地方的变量列表。

该列表中的变量数应该与DECLARE语句中选择语句所使用的变量数相同。

变量的数据类型也应该与被选择列的数据类型相同。

直到下一次使用FETCH语句之前,变量中的值都会一直保持。

每一次FETCH的执行都存储在系统变量@@fetch_status中。

如果FETCH成功,则@@fetch_status被设置成0。

@@fetch_status为-1表示已经到达了结果集的一部分(例如,在游标被打开之后,基表中的行被删除)。

@@fetch_status可以用来构造游标处理的循环。

例如:
DECLARE @iname char(20), @fname char(20)
OPEN author_cur
FETCH FIRST FROM author_cur INTO @iname, @fname
WHILE @@fetch_status = 0
BEGIN
IF @fname = ‘Albert’
PRINT “Found Albert Ringer”
ELSE
Print “Other Ringer”
FETCH NEXT FROM author_cur INTO @iname, @fname
END
iv. 关闭游标
CLOSE语句用来关闭游标并释放结果集。

游标关闭之后,不能再执行FETCH操作。


果还需要使用FETCH语句,则要重新打开游标。

语法如下:
CLOSE [GLOBAL] cursor_name | cursor_variable_name
v. 释放游标
游标使用不再需要之后,要释放游标。

DEALLOCATE语句释放数据结构和游标所加的锁。

语法如下:
DEALLOCATE [GLOBAL] cursor_name | cursor_variable_name
下面给出游标的一个完整的例子:
USE master
GO
CREATE PROCEDURE sp_BuildIndexes
AS
DECLARE @TableName sysname, @msg varchar(100), @cmd varchar(100)
DECLARE table_cur CURSOR FOR
SELECT name FROM sysobjects WHERE type=’u’
OPEN table_cur
FETCH NEXT FROM table_cur INTO @TableName
WHILE @@fetch_status = 0
BEGIN
IF @@fetch_status = -2
CONTINUE
SELECT @msg = “Building indexes for table”+@TableName+”…”
PRINT @msg
SELECT @cmd = “DBCC DBREINDEX (‘”+@TableName+”')”
EXEC (@cmd)
PRINT ““
FETCH NEXT FROM table_cur INTO @TableName
END
DEALLOCATE table_cur
GO
下面的脚本将为PUBS数据库执行sp_BuildIndexes
USE pubs
GO
EXEC ap_BuildIndexes
注意:上面也是创建用户定义的系统存储过程的示例。

1).定义一个游标实现,返回公司信息表中所有的数据,打开游标,然后遍历公司信息
表,直到找到公司名称为“北京怡神工贸公司”的记录为止,并且打印公司代码、公司名称。

2)关闭和释放该游标。

实验四存储过程与触发器一.实验目的
1.了解存储过程和触发器的基本作用
2.掌握存储过程和触发器的创建方法
3.掌握存储过程和触发器的运行机制
4.了解常见的系统存储过程
二.实验要求
1.熟悉SQL语法
2.熟练掌握企业管理器管理对象的方法
3.掌握SQL查询分析器的用法
4.了解存储过程和触发器的相关知识
三.实验内容
1.创建一个存储过程
2.创建一个触发器
四.实验指导
1.存储过程是保存起来的可以接受和返回用户提供的参数的Transact-SQL 语句的集
合。

可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),
或在所有会话中临时使用(全局临时过程)。

创建存储过程的语法及参数如下:
1).语法
CREATE [ PROCEDURE] procedure_name [;number]
[{@parameter data_type}
[V ARYING][=default][OUTPUT]
] [,...n]
[WITH
{ RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[FOR REPLICATION]
AS sql_statement [...n]
2).参数
procedure_name:新存储过程的名称。

过程名必须符合标识符规则,且对于数据
库及其所有者必须唯一。

number:是可选的整数,用来对同名的过程分组,以便用一条DROP
PROCEDURE 语句即可将同组的过程一起除去。

例如,名为orders 的应用程
序使用的过程可以命名为orderproc;1、orderproc;2 等。

DROP PROCEDURE
orderproc 语句将除去整个组。

如果名称中包含定界标识符,则数字不应包含在
标识符中,只应在procedure_name 前后使用适当的定界符。

@parameter:过程中的参数。

在CREATE PROCEDURE 语句中可以声明一个或
多个参数。

用户必须在执行过程时提供每个所声明参数的值(除非定义了该参
数的默认值)。

存储过程最多可以有 2.100 个参数。

使用@ 符号作为第一个字
符来指定参数名称。

参数名称必须符合标识符的规则。

每个过程的参数仅用于
该过程本身;相同的参数名称可以用在其它过程中。

默认情况下,参数只能代
替常量,而不能用于代替表名、列名或其它数据库对象的名称。

data_type:参数的数据类型。

所有数据类型(包括text、ntext 和image)均可
以用作存储过程的参数。

不过,cursor 数据类型只能用于OUTPUT 参数。


果指定的数据类型为cursor,也必须同时指定V ARYING 和OUTPUT 关键字。

V ARYING:指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变
化)。

仅适用于游标参数。

default:参数的默认值。

如果定义了默认值,不必指定该参数的值即可执行过程。

默认值必须是常量或NULL。

如果过程将对该参数使用LIKE 关键字,那么默
认值中可以包含通配符(%、_、[] 和[^])。

OUTPUT:表明参数是返回参数。

该选项的值可以返回给EXEC[UTE]。

使用
OUTPUT 参数可将信息返回给调用过程。

Text、ntext 和image 参数可用作
OUTPUT 参数。

使用OUTPUT 关键字的输出参数可以是游标占位符。

2.触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时
自动执行。

创建触发器的语法及参数如下:
1).语法
CREATE TRIGGER trigger_name
ON { table|view }
[ WITH ENCRYPTION ]
{{{FOR|AFTER|INSTEAD OF}{[INSERT][,][UPDATE]}
[WITH APPEND]
[NOT FOR REPLICATION]
AS
[{IF UPDATE(column)
[{AND|OR}UPDATE(column)][ ...n ]
|IF(COLUMNS_UPDATED(){bitwise_operator}updated_bitmask)
{comparison_operator}column_bitmask[...n]}]
sql_statement [ ...n ]}}
2).参数
trigger_name:是触发器的名称。

触发器名称必须符合标识符规则,并且在数据库中必须唯一。

可以选择是否指定触发器所有者名称。

Table | view:是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。

可以选择是否指定表或视图的所有者名称。

WITH ENCRYPTION:加密syscomments表中包含CREATE TRIGGER 语句文本的条目。

使用WITH ENCRYPTION可防止将触发器作为SQL Server复制的一部分发布。

AFTER:指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。

所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

如果仅指定FOR关键字,则AFTER是默认设置。

不能在视图上定义AFTER 触发器。

INSTEAD OF:指定执行触发器而不是执行触发SQL 语句,从而替代触发语句的操作。

在表或视图上,每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEAD OF触发器。

然而,可以在每个具有INSTEAD OF触发器的视图上定义视
图。

INSTEAD OF触发器不能在WITH CHECK OPTION的可更新视图上定义。

如果向指定了WITH CHECK OPTION 选项的可更新视图添加INSTEAD OF触发器,SQL Server将产生一个错误。

用户必须用ALTER VIEW删除该选项后才能定义INSTEAD OF 触发器。

{ [DELETE] [,] [INSERT] [,] [UPDATE] }:是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。

必须至少指定一个选项。

在触发器定义中允许使用以任意顺序组合的这些关键字。

如果指定的选项多于一个,需用逗号分隔这些选项。

对于INSTEAD OF触发器,不允许在具有ON DELETE级联操作引用关系的表上使用DELETE选项。

同样,也不允许在具有ON UPDATE级联操作引用关系的表上使用UPDATE选项。

WITH APPEND:指定应该添加现有类型的其它触发器。

WITH APPEND 不能与INSTEAD OF触发器一起使用,或者,如果显式声明AFTER触发器,也不能使用该子句。

只有当出于向后兼容而指定FOR时(没有INSTEAD OF或AFTER),才能使用WITH APPEND。

NOT FOR REPLICATION:表示当复制进程更改触发器所涉及的表时,不应执行该触发器。

AS:是触发器要执行的操作。

sql_statement:是触发器的条件和操作。

触发器条件指定其它准则,以确定DELETE、INSERT或UPDATE语句是否导致执行触发器操作。

当尝试DELETE、INSERT或UPDATE操作时,Transact-SQL语句中指定的触发器操作将生效。

触发器可以包含任意数量和种类的Transact-SQL语句。

触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。

触发器中的Transact-SQL语句常常包含控制流语言。

CREATE TRIGGER语句中使用几个特殊的表:deleted和inserted是逻辑(概念)表。

这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);
n:是表示触发器中可以包含多条Transact-SQL语句的占位符。

对于IF UPDATE (column)语句,可以通过重复UPDATE (column)子句包含多列。

IF UPDATE(column):测试在指定的列上进行的INSERT或UPDATE操作,不能用于DELETE操作。

可以指定多列。

因为在ON子句中指定了表名,所以在IF UPDATE 子句中的列名前不要包含表名。

若要测试在多个列上进行的INSERT或UPDATE操作,请在第一个操作后指定单独的UPDATE(column)子句。

在INSERT操作中IF UPDATE将返回TRUE值,因为这些列插入了显式值或隐性(NULL)值。

column:是要测试INSERT或UPDATE操作的列名。

该列可以是SQL Server支持的任何数据类型。

IF (COLUMNS_UPDATED()):测试是否插入或更新了提及的列,仅用于INSERT或UPDATE触发器中。

COLUMNS_UPDATED返回varbinary 位模式,表示插入或更新了表中的哪些列。

COLUMNS_UPDATED函数以从左到右的顺序返回位,最左边的为最不重要的位。

最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。

如果在表上创建的触发器包含8列以上,则COLUMNS_UPDATED返回多个字节,最左边的为最不重要的字节。

在INSERT操作中COLUMNS_UPDATED将对所有列返回TRUE 值,因为这些列插入了显式值或隐性(NULL)值。

bitwise_operator:是用于比较运算的位运算符。

updated_bitmask:是整型位掩码,表示实际更新或插入的列。

例如,表t1 包含列C1、C2、C3、C4和C5。

假定表t1上有UPDATE 触发器,若要检查列C2、C3和C4是否都有更新,指定值14;若要检查是否只有列C2有更新,指定值2。

comparison_operator:是比较运算符。

使用等号(=)检查updated_bitmask 中指定的所
有列是否都实际进行了更新。

使用大于号(>)检查updated_bitmask中指定的任一列或某些列是否已更新。

column_bitmask:是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。

3.使用企业管理器创建和管理存储过程。

1).选择要创建存储过程的数据库结点并展开,右键点击点击存储过程从弹出的菜单
中选择“新建存储过程(S)”即可如下图3-1所示,之后出现图3-2所示的界面。

图3-1
图3-2
在图3-2所示的“文本(T)”框中填写创建存储过程的语句,之后必须进行语法检查。

也可以在权限对话框中选择允许哪些用户执行此存储过程,如图3-2所示,点击确定按钮退出创建对话框。

图3-3
2).企业管理器中也可以修改已有的存储过程,选择数据库中的“存储过程”结点并
展开,企业管理器中右边的会列出此数据库中所有的存储过程,选中要修改的存储过程,右键点击选择弹出菜单中的“属性”选项(如图3-4所示)即可出现图3-2所示的窗口,余下过程类似于存储过程的创建。

图3-4
3.使用企业管理器创建和管理触发器。

2).选中数据库结点并展开,找到要创建触发器的表或视图,右键点击,从弹出的菜单
中选择“所有任务(K)”的子菜单中选择“管理触发器(T)…”命令,如图3-5所示,系统将弹出如图3-6所示的对话框。

图3-5
图3-6
在图3-6所示的“文本(T)”框中填写创建触发器的语句,之后必须进行语法检查。

也可以删除已有的触发器,点击确定按钮退出创建对话框。

3).企业管理器中也可以修改或删除已有的触发器,在图3-6中的“名称(N)”下拉框中
选择要修改或删除的触发器,修改过后的触发器必须进行语法检查,之后点击“应用”
按钮即可,若要删除直接点击“删除(D)”按钮即可。

4.在查询在SQL-查询分析器中创建存储过程和触发器。

按照前面所给的语法要求输入SQL语句即可。

6.存储过程和触发器的运行
必须在SQL语句中调用存储过程才可以运行之,可以使用“EXE(CTUE)”命令来运行存储过程,触发器的运行是由系统自动完成的,无需用户的参与,当某些事件被触发是,系统就调用相应的触发器。

作业:
按照如下所给的要求实现存储过程和触发器,并运行之。

1).创建一个存储过程,实现对课程表的参数插入。

2).创建一存储过程实现输入某姓名,打印查有此人,并输出其学号。

3).创建一个触发器,使得当删除了表学生中的某一学生时,与其相关的成绩都被删除。

4)创建一个存储工程,实现进货表进货的时候,改变库存的数量和价格。

实验五SQL约束管理与用户自定义类型
一.实验目的
1.理解用户自定义类型的创建和使用方法。

2.掌握SQL Server 中数据库约束的管理方法。

3. 掌握数据库三类完整性,在SQL 中的实现
二.实验内容
数据库的完整性描述为数据库内容的完整性约束集合,其中完整性约束指数据库的一个状态是否合理。

数据库系统检查数据的状态和状态转换,判定它们是否合理,是否应予接受。

对一个数据库操作,要判定其是否符合完整性约束,全部判定无矛盾时才可以执行。

数据完整性包括实体完整性、域完整性、引用完整性、用户定义完整性。

(一).用户自定义约束
1、DEFAULT 约束
DEFAULT通过指定列的默认值,每个列中只能有一个DEFAULT约束。

如果列已有默认值,必须除去旧默认值后才能添加新默认值。

DEFAULT约束只用于INSERT INTO 语句,当在INSERT 语句中没有指定一个值,DEFAULT 约束在列中自动输入一个值。

[CONSTRAINT contraint_name]
DEFAULT contraint_expression
作业:为学生表中的年龄字段设置默认约束,默认年龄为20岁
2、CHECK约束
CHECK约束是通过限制可输入到一列或多列中的可能值来强制实现域的完整性。

可用于INSERT 和 UPDATE语句。

实现语法:
[CONSTRAINT contraint_name]
CHECK logic_expression
作业:在学生表中增加一个邮政编码字段,要求输入的数据为六位的数字
3、UNIQUE约束
使用 UNIQUE 约束确保在非主键列中不输入重复值。

在一个表内可以定义多个
UNIQUE 约束,在允许空值的列上可以定义 UNIQUE 约束。

例如在职员表中,职员代码是主键,另有一列职员身份证,如果想使职员的身份证
号也不重复,就需要建立一个UNIQUE约束。

作业:设定学生表的姓名字段具有唯一性
(二)实体完整性 PRIMARY KEY约束
表中经常有一个列或列的组合,其值能唯一地标识表中的每一行。

这样的一列或多列。

相关文档
最新文档