视图,事务,索引的sql

/*索引
缺点:
 1、增加存储空间
 2、降低IDU操作的性能
优点:
 1、提升SELECT操作的性能

语法:
 create index ix_name
 on tblName(col_name)


==================================================================
  视图
适用范围
1、大表
2、经常查询的字段

不适用范围
1、小表
2、很少查询的字段
3、字段值为有限值


聚集索引:
 特点:会影响记录的物理排序
  只能有一个
  针对表创建主键时会自动增加聚集索引
 优点:会进一步提高查询性能

非聚集索引:可以有多个
 [默认]

代码重用:
  多条T-SQL语句需重用,则封装到存储过程中
  如果一条select 语句重用,则封装到视图中
=============================================================================
事务:一个业务逻辑包含多个步骤,要么全部执行所有步骤,要么全部不执行.


begin transaction :开始事务
rollback tran 回滚事务
commit transaction:提交事务

特性:ACID
原子性:不可分割
一致性:
隔离性:
持久性:

分类:
显示事务:以begin tran开头
隐式事务:省略begin tran,
自动提交事务:单条sql语句,本身就是一个事务

重点注意:
begin tran之后只能跟一次commit tran 或rollback tran
,不能同时既commit tran , 又rollback tran

不带 保存点 和 事务名称 的 ROLLBACK TRANSACTION 回滚到事务的起点。
嵌套事务时,该语句将所有内层事务回滚到最远的 BEGIN TRANSACTION 语句
*/

 

 

--图书信息表
create table tbl_book(
	book_id varchar(20) primary key ,--书的编号
	book_name varchar(20) ,--书名
	book_status bit --0表示已还,1表示已借
)

--借阅表
create table tbl_borrow
(
	borrow_id varchar(20) primary key, --借书编号
	book_id varchar(20) ,	--书的编号
	borrow_person varchar(20) ,	--借书人
	borrow_date datetime		--借书日期
)

delete from tbl_book
delete from tbl_borrow

insert into tbl_book
values('bk0001','红楼梦',0)
insert into tbl_borrow
values('js02','bk0001','张三','2009-03-10')

--因为表tbl_borrow中的借书人会经常被查询,请进行优化  
create index ix_tbl_borrow_borrowperson
on tbl_borrow(borrow_person)
--select * from tbl_book
--创建视图
create view v_book_borrow
as 
    select  borrow_id as 借书编号,    book_name as 书名, borrow_person as 借书人 ,borrow_date as 借书日期
     from tbl_book,tbl_borrow  where tbl_book.book_id=tbl_borrow.book_id
go
select * from v_book_borrow

/*三、借书业务
现有一笔借书记录,
编号为 'brw001',书的编号为'bk0001', 借书人为张三,日期为系统当前日期,
注1:借书时需修改图书的标识为已借
注2:如果该书已借则不能完成业务
*/

--EXISTS用于检查子查询是否至少会返回一行数据,空返回false
--select * from tbl_borrow
 begin transaction
     if(exists(select * from tbl_book where book_id='bk0001'and book_status='0'))
	begin 
	    insert into tbl_borrow values('brw001','bk0001','张三',getdate())
            update tbl_book set book_status='1' where book_id='bk0001'
	end

     if(exists(select * from tbl_book where book_id='bk0001'and book_status='1'))
       begin
		print '书本已经被借出,等归还后再借'
		rollback transaction
		return
	end
 commit transaction


/*
测试索引的效率
往表中插入20万条记录,判断有索引与无索引时的查询效率
*/


delete from tbl_stu_for_loop--删除表中数据
drop table tbl_stu_for_loop--删除表
create table tbl_stu_for_loop
(
	stu_id int 
	
)

declare @i int 

set @i=1

while(@i<=200000)
begin 
        insert into tbl_stu_for_loop values (@i)
        set @i=@i+1
end


--创建索引
create index ix_tbl
on tbl_stu_for_loop(stu_id)

drop index tbl_stu_for_loop.ix_tbl--删除索引


declare @beginTime datetime
set @beginTime=getdate()
select *from tbl_stu_for_loop
declare @endTime datetime
set @endTime=getdate()
select datediff(ms,@beginTime,@endTime) as '所需时间(毫秒)'


--------------------------------------------------------------------
--帐户表
create table tbAccount
(
	code varchar(20) primary key ,
	balance decimal(10,2) 
)

insert into tbAccount values('zs',2000) 
insert into tbAccount values('ls',5000) 

--delete from tbAccount
--select * from tbAccount

declare @from varchar(20)
declare @to varchar(20)

begin tran
	set @from='zs'
	set @to='ls'

	if(not exists(select * from tbAccount where code=@from))
	begin
		print '转出者不存在,转帐失败'
		return
	end

	if(not exists(select * from tbAccount where code=@to))
	begin
		print '转入者不存在, 转帐失败'
		return
	end

	update tbAccount
	set balance=balance-1000
	where code=@from
	waitfor delay '0:0:01'

	if((select balance from tbAccount where code=@from)<0)
	begin
		print '金额不足, 转帐失败'
		rollback tran
		return
	end

	update tbAccount
	set balance=balance+1000
	where code=@to

	print '转帐成功'
commit tran

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值