搜索
您的当前位置:首页正文

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

2023-12-21 来源:易榕旅网
SQL视图局部变量全局变量条件语句事务触发器

⼀.视图

1.视图是⼀张虚拟表,他所存储的不是实际数据,⽽是查询语句,但我们可以对视图进⾏像数据表⼀样的操作。

2.为什么使⽤视图呢?我的理解是:1.在远程传输数据时,可以避免过长的查询字符,减少流量。2.他可以简化繁杂的多表嵌套查询语句。3.安全性,防⽌⾮法⽤户访问敏感数据,因为我们可以通过创建视图展⽰给⽤户,我们想要给他们查看的数据。3.视图的创建

create view vw_cityas

select cityName from city --这个查询语句可以随便的写,如果是些多层次的嵌套查询语句的话,那么下⾯使⽤视图的简易性就突出了。应为只⽤⼀句简短的查询语句就能把原本繁杂的搞定

4.视图的查询

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服务器安装的⽇期、版本和处理器类型。

四.条件语句1.条件语句

if(条件表达式)begin语句...endelsebegin语句...end

2.循环语句

whilebegin语句....

break/continueend

五.事务(去不了终点,回到原点)

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,如果错了,这⾥将不是0update bank set HeMoney=HeMoney+100 where ID=he ---给我朋友卡⾥加上1000set @ersum=@ersum+@@ERROR --如果这⾥的结果是0将表明没有出错if(@ersum<>0) --true有错,false没错begin

rollback tran ---回滚事务endelsebegin

commit tran --执⾏事务end

六.触发器

1.触发器,当数据库中的表有所改动(添删改)是会触发⼀中事件,这样⼀种机制,就是触发器。

2.触发器种类:after跟for⼀样,是语句执⾏完毕后触发事件。instead of :本来你要执⾏⼀种操作,结果执⾏了另外⼀种操作,原本要执⾏的操作被替换。3.触发器的创建

create trigger 触发器名 on 操作表(实际要操作的表)

for|after|instead of --选其任意⼀种类型,其中for跟after是⼀样的update|delete|insert --原本要执⾏哪⼀种动作as

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表都为系统⾃动⽣成的,不是我们操作的表。七.如果我哪⾥写错了,或者你想说点什么,欢迎留⾔。。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top