一、变量的定义与赋值
declare @变量名 类型
set @变量名=值
eg、
查汽车表中名称含有宝马两个字的
declare @name varchar(20)
set @name=‘宝马‘
select * from car where Name like ‘%‘[email protected]+‘%‘
查汽车表中所有汽车的平均值并输出
declare @price decimal(10,4)
select @price = AVG(Price) from Car
print ‘所有汽车的平均价格为:‘+cast(@price as varchar(20))
二、语句
1、输出语句 print ‘字符串‘
2、分支语句
a、if else
if 判断条件
begin
要执行的语句
end
else
begin
要执行的语句
end
b、case 语句(相当于C#的swtich case)(两种用法)
1.简单Case函数
CASE sex
WHEN ‘1‘ THEN ‘男‘
WHEN ‘2‘ THEN ‘女‘
ELSE
‘其他‘
END
2.Case搜索函数
CASE
WHEN sex = ‘1‘ THEN ‘男‘
WHEN sex = ‘2‘ THEN ‘女‘
ELSE
‘其他‘
END
eg1、
declare @ccname varchar(20)
set @ccname = ‘宝马‘
select * from Car where Name like
case
when @ccname=‘宝马‘ then ‘%宝马%‘
when @ccname=‘奥迪‘ then ‘%奥迪%‘
else ‘%‘
end
1).两者相比,Case搜索函数功能更强。
2).Case函数类似于if……else if 语句,只返回第一个符合条件的值,之后的部分会被忽略
注意:语句结束之后不要写分号或逗号
三、存储过程
1、不带参数的存储过程(跟 视图作用相同)
eg
1 create procedure MyPRO --procedure为创建存储过程关键字,也可以简写proc,MyPRO为存储过程名 2 as 3 select * from authors 4 --执行存储过程 5 exec mypro --exec表示执行存储过程
2、带参数的存储过程
create procedure BuyFriut @Uid varchar(50), @Fcode varchar(50), @Sl int as begin declare @kc int,@price float select @kc=Numbers,@price=Price from Fruit where Ids=@Fcode if @Sl>@kc begin print ‘库存不足!‘ end else begin declare @ye float select @ye=Account from Login where UserName=@Uid if @ye>= @price*@Sl begin update Fruit set Numbers=Numbers-@Sl where Ids=@Fcode update Login set Account=Account-@price*@Sl where UserName=@Uid declare @sj int set @sj = cast(rand()*10000 as int) insert into Orders values(@sj,@Uid,GETDATE())--添加内容的时候 先写主键表,再写外键表 insert into OrderDetails values(@sj,@Fcode,@Sl) end else begin print ‘余额不足!‘ end end end go --使用存储过程 declare @s int exec @s = BuyFriut ‘wangwu‘,‘k001‘,20 print @s --删除存储过程 drop proc BuyFriut
3、触发器
触发器,是一种特殊的存储过程,可以用来对表实施复杂的完整性约束,保持数据的一致性。当触发器所保护的数据发生改变时,触发器会自动被激活,并执行触发器中所定义的相关操作,从而保证对数据的不完整性约束或不正确的修改。
用到的两个表inserted表和deleted表,临时表,作用是为了恢复数据
eg
select * from Loginone
select * from biandong
go
--创建触发器
create trigger TR_LOGINONE_DELETE
on Loginone
a、for delete 触发器 --删除的时候执行(第一类)
eg
as begin declare @uid varchar(50),@name varchar(50) select @uid=UserName,@name=Name from deleted insert into biandong values(@uid,@name,‘删除‘) end go --在对表loginnoe进行删除的时候触发器执行 delete from Loginone where UserName=‘aaa‘ go
b、instead of delete 触发器 --替代执行(第三类)
--删除student里面的数据的时候用另外两条语句替代,先删从表再删主表 create trigger TR_STUDENT_DELETE on Student instead of delete as begin declare @sno varchar(20) select @sno=sno from deleted delete from score where sno=@sno delete from student where sno=@sno end --执行删除的时候触发 delete from student where sno=‘101‘
c、after delete --删除之后执行(第二类)
4、事务
a、开始事务 begin tran(transaction)
b、提交 commit
c、回滚 rollback
select * from Car select * from Brand begin transaction --开始事务 delete from Car where Code=‘c005‘ delete from Brand where Brand_Code=‘b002‘ if @@ERROR=0--判断是否出错,如果执行没错@@ERROR为0 begin commit -- 提交事务 end else begin rollback--回滚事务 end --try catch begin transaction --开始事务 begin try --try里面写要执行的代码 delete from Car where Code=‘c005‘ delete from Brand where Brand_Code=‘b002‘ commit end try begin catch rollback end catch