首页 电脑 电脑学堂 查看内容

SQL视图、局部变量、全局变量、条件语句、事务和触发器简析

2012-5-30 16:29 474 0

摘要: 一.视图   1.视图是一张虚拟表,他所存储的不是实际数据,而是查询语句,但我们可以对视图进行像数据表一样的操作。 2.为什么使用视图呢?我的理解是:1.在远程传输数据时,可以避免过长...
关键词: nbsp select 数据 语句 变量 视图 触发器 查询 当前 如果

一.视图   1.视图是一张虚拟表,他所存储的不是实际数据,而是查询语句,但我们可以对视图进行像数据表一样的操作。 2.为什么使用视图呢?我的理解是:1.在远程传输数据时,可以避免过长的查询字符,减少流量。2.他可以简化繁杂的多表嵌套查询语句。3.安全性,防止非法用户访问敏感数据,因为我们可以通过创建视图展示给用户,我们想要给他们查看的数据。 3.视图的创建 4.视图的查询 create view vw_city as  www.2cto.com   select cityName from city   --这个查询语句可以随便的写,如果是些多层次的嵌套查询语句的话,那么下面使用视图的简易性就突出了。应为只用一句简短的查询语句就能把原本繁杂的搞定   select * from vw_city 5.由于视图是以查询语句的形式存储的,所以一般视图只用于查看数据,一般不对视图进行增删改。如果数据库中的表数据改变那么视图中的数据也会随之改变,因为视图就相当于查询语句。  二.局部变量(使用便于写数据库方法,及存储过程等)   1.局部变量的声明(一个@) declare @n int   --声明变量关键字为declare 然后@加变量名 后面是变量类型 declare @s varchar(36)   2.局部变量的赋值 set @s='f4' set @n=@n+1  --变量的赋值有两种方法,一种是通过set,一种是select 如果变量不附初始值则默认为null,null参与计算的结果还是null,这一行的@n就等于null select @n=age from students  --如过变量通过select赋值,这里可能在表中查到很多age结果,这里只赋值查询出来的最后一个age结果,如果set使用这种方法会出错。 set @n=(select age from Students where ID='1')--亦可以这样给他赋值  三.全局变量 1.全局变量是系统自定义,维护的,我们不能修改全局变量的值。以@@开头。 2.全局变量一览 select APP_NAME ( ) as w --当前会话的应用程序 select @@ERROR    --返回最后执行的 Transact-SQL 语句的错误代码(integer)(如果最后一条语句不出错,就一直是0) select @@IDENTITY   --返回最后插入的标识值 select USER_NAME()    --返回用户数据库用户名 select @@CONNECTIONS  --返回自上次SQL启动以来连接或试图连接的次数。 select GETDATE() --当前时间 select @@CPU_BUSY/100  --返回自上次启动SQL 以来 CPU 的工作时间,单位为毫秒 USE tempdb select @@DBTS  as w  --为当前数据库返回当前 timestamp 数据类型的值。这一 timestamp 值保证在数据库中是唯一的。 select @@IDLE  as w  --返回SQL自上次启动后闲置的时间,单位为毫秒 select @@IO_BUSY AS w   --返回SQL自上次启动后用于执行输入和输出操作的时间,单位为毫秒 select @@LANGID AS w   --返回当前所使用语言的本地语言标识符(ID) select @@LANGUAGE AS w   --返回当前使用的语言名 select @@LOCK_TIMEOUT as w  --当前会话的当前锁超时设置,单位为毫秒。 select @@MAX_CONNECTIONS  as w  --返回SQL上允许的同时用户连接的最大数。返回的数不必为当前配置的数值 EXEC sp_configure  --显示当前服务器的全局配置设置 select @@MAX_PRECISION as w --返回 decimal 和 numeric 数据类型所用的精度级别,即该服务器中当前设置的精度。默认最大精度38。 select @@OPTIONS  as w  --返回当前 SET 选项的信息。 select @@PACK_RECEIVED as w  --返回SQL自启动后从网络上读取的输入数据包数目。 select @@PACK_SENT as w  --返回SQ自上次启动后写到网络上的输出数据包数目。 select @@PACKET_ERRORS as w  --返回自SQL启动后,在SQL连接上发生的网络数据包错误数。 select @@SERVERNAME as w --返回运行SQL服务器名称。 select @@SERVICENAME  as w --返回SQL正在其下运行的注册表键名 select @@TIMETICKS  as w --返回SQL服务器一刻度的微秒数 select @@TOTAL_ERRORS AS w  --返回 SQL服务器自启动后,所遇到的磁盘读/写错误数。 select @@TOTAL_READ  as w  --返回 SQL服务器自启动后读取磁盘的次数。 select @@TOTAL_WRITE as w  --返回SQL服务器自启动后写入磁盘的次数。 select @@TRANCOUNT  as w  --返回当前连接的活动事务数。 select @@VERSION as w  --返回SQL服务器安装的日期、版本和处理器类型。    www.2cto.com   四.条件语句 1.条件语句   if(条件表达式) begin 语句... end else begin 语句... end   2.循环语句 while begin 语句.... break/continue end  五.事务(去不了终点,回到原点) 1.事务:如果你要一起执行多条语句,如果有一条失败你就可以让他们全部都撤销执行。   begin tran  --开启一个事物 delete from city   select * from city ---这里查询没有数据,因为上一句删除了 rollback tran   select * from city  --这里在查询,惊奇的发现,数据又恢复了,因为上一句rollback是 让这个事务回滚的效果,  begin tran  --开启一个事物 delete from city   select * from city ---这里查询没有数据,因为上一句删除了 commit tran   select * from city  --这里在查询,不好意思,数据真的没了,即便下边你在rollback数据也回不来了,因为commit执行了数据真的把数据删掉了   2.事务小案例   ---bank表为转账表,MeMoney字段为我的账余额,HeMoney为朋友的账户余额,这个事务完成的是我给朋友转账 begin tran declare @ersum int        --定义这个局部变量为了记载这个事务过程中是否会出错,如果出错则最终将得不到为0的值,也就完成了我们判断这个事务是否出错过 set @ersum=0  update bank set MeMoney=MeMoney-1000 where ID=me   ---从我卡里扣掉1000 set @ersum=@ersum+@@ERROR           --如果不出错这里还是0,如果错了,这里将不是0 update bank set HeMoney=HeMoney+100 where ID=he    ---给我朋友卡里加上1000 set @ersum=@ersum+@@ERROR     --如果这里的结果是0将表明没有出错 if(@ersum<>0)  --true有错,false没错 begin rollback tran  ---回滚事务 end else begin commit tran    --执行事务 end   六.触发器 1.触发器,当数据库中的表有所改动(添删改)是会触发一中事件,这样一种机制,就是触发器。 2.触发器种类:after跟for一样,是语句执行完毕后触发事件。instead of :本来你要执行一种操作,结果执行了另外一种操作,原本要执行的操作被替换。 3.触发器的创建 create trigger 触发器名 on 操作表(实际要操作的表) for|after|instead of  --选其任意一种类型,其中for跟after是一样的 update|delete|insert    --原本要执行哪一种动作 as  www.2cto.com   sql语句.....    ---你想要执行的sql语句 4.触发器的小案例 --这个例子是,删除Tb1里面的数据,把删除的数据同时备份到Tb1Bak表中 create trigger tri_bak on Tb1  --声明一个tri_bak ,如果Tb1表中的数据变化触发这个触发器 after delete   ---删除完成后执行下面的操作 as insert into Tb1Bak select * from deleted   ---这里的deleted是系统自动生成的表,存放为上一次的数据库表中删除的数据。   5.小知识点:数据更新插入删除的过程为,插入数据库表的同时,也插入了系统表的insert表,删除的同时把删除的这条数据插入到了deleted表中,跟新的同时,deleted表中插入就数据,insert表中也添加了新数据。  我这里的insert 、deleted表都为系统自动生成的,不是我们操作的表。     作者 张龙豪
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部