数据库基础复习 二

原创
10/14 15:38
阅读数 24

T-SQL编程

--声明变量   必须加   
--declare @name nvarchar(50)
--declare @age int 
--一次赋值多个变量
declare @name nvarhcar(50),@age int 
--为变量赋值
set @name='小刘'
select @age =24
--输出
select '姓名',@name
select '年龄',@age

while循环

declare @i int=1
while(@i<=100)
begin 
	set @i=@i+1
	print 'hello world'
end

计算一到一百之间的所有整数和

declare @i int=1
declare @num int=0
while(@i<=100)
begin
	set @i=@i+1
	set @num=@num+@i
end
select @num

if语句

declare @i int=10
if @i>10
begin
	print '@i大于10'
end
else if @i>5
begin
	print '@i大于5'
end
else
begin
	print '@i小于5'
end

计算一百以内所有奇数的和 偶数的和

declare @i int=1
declare @jnum int=0
declare @onum int=0
while @i<=100
	begin 
		set @i=@i+1
		if @i%2=0
		begin
			set @onum=@onum+@i
		end
		else 
		begin
			set @jnum=@jnum+@i
		end
	end
select @jnum as '奇数和'
select @onum as '偶数和'

全局变量

@@开头的一半都是系统变量

事务

事务的执行过程

开始事务 begin transaction

事务提交commit transaction

事务回滚 rollback transaction 判断某条语句是否执行出错

begin transaction
	declare @i int=0
	update 表1 set 列=。。。 where  条件
	set @i=@i+@@error
	update 表2 set 列=。。。 where 条件
	set @i=@i+@@error
	if @i<>0
	begin
	rollback transaction
	end
	else
	begin 
	commit transaction
	
事务的种类

自动提交事务

查询语句,数据库自动打开一个事务,当语句执行出错时,系统自动回滚

显示事务

自己写事务,自己写事务代码,手动提交事务或回滚

隐式事务

每次执行一条sql语句的时候,数据库自动给我们添加一条事务,需要我们手动回滚或提交

事务的特性

原子性(Atomicity)

  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

一致性(Consistency)

  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

  拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

隔离性(Isolation)

  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

  关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

持久性(Durability)

  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

  例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

以上介绍完事务的四大特性(简称ACID),现在重点来说明下事务的隔离性,当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:

存储过程

优点:

执行速度更快-在数据库中保存的存储过程语句都是编译过的 允许模块化程序设计-类似方法的复用 提高系统安全性-防止SQL注入 减少网络流通重-只要传输存储过程的名称

创建存储过程

语法

-----定义存储过程
create proc 存储过程名
as
begin
	sql语句
end
-----调用存储过程

exec  存储过程名


---定义带参数的存储过程
create proc 存储过程名
@n1 int,
@n2 int
as 
begin 
	sql语句
end
---调用带参数的存储过程
exec 存储过程名 100,200
或者
exec 存储过程名 @n1=100,@n2=200

-------定义带返回值的存储过程
create proc 存储过程名
@n1 int,
@n2 nvarchar(2) output
as 
begin 
	set @n2=sql语句 
end
-------调用带返回值的存储过程
declare @num int
exec 存储过程名 100,@num output

-----------------------------------------使用存储过程实现转账-----------------------------------------------
create proc 存储过程名
@from char(10),
@in char(10),
@balance money
@isOk bit output
as 
begin 
	--判断账户钱是否足够
	declare @money money
	select @money=余额 from 表名 where 账户=@from
	if @money>@balance
	begin 
		begin transaction ------开启事务
		declare @num int=0
		update 表 set 列=列-@balance where 账户=@from    ---账户1减钱
		set @num=@num+@@error
		update 表 set 列=列+@balance where 账户=@in      ---账户2加钱
		set @num=@num+@@error
		if @num<>0   	 -----判断num的值是否等于0
		begin 
			rollback     ------不是则代表执行出错  回滚
		end
		else 
		begin
			commit		 ------是则代表成功   提交
		end
	end
	else 
	begin 
	end
end




set 和select赋值的区别

declare @a int 
set @a=(select 列1,列2 from 表 where 。。。)----如果后面的查询语句查询多个值,那么用set赋值就会报错
select @a=(select 列1,列2 from 表 where 。。。)----如果后面的查询语句查询出多个值,用select赋值,那么将最后的一个查询结果返回给变量

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部