目录
三.视图
1.为什么需要视图
示例:求出平均工资最高的部门的编号和部门平均工资(不使用top,top不可移植)。
简化查询——避免了代码的冗余与属性大量重复的SQL语句
2.什么是视图
从代码上看,视图是一个SELECT语句;
从逻辑上看,视图被当做一个虚拟表看待。
3.视图的格式
CREATE VIEW 视图的名字
AS
--SELECT的前面不能添加BEGIN
SELECT语句
--SELECT的后面不能添加END
4.视图的优点
- 简化查询
- 增加数据的保密性
对emp表中的工资和入职时间进行隐藏,使用户只能对虚拟表进行各种操作。
(根据具体情况,对虚拟表的增删改查各种操作可能会影响具体表)
5.视图的缺点
- 增加了数据库维护的成本;
- 视图只是简化了查询,但是并不能加快查询的速度,这也是视图使用不足的地方。
例如:若想删除emp表中的ename属性,则包含ename的虚拟表不会随之删除ename,且运行会报错。
6.注意的问题
- 创建视图的SELECT语句必须为所有的计算列指定别名;
- 视图不是物理表,是虚拟表;
- 不建议通过视图更新所依附的原始表的数据或结果。
四.事务
1.初学者必须要掌握的三个问题
(1)事务是用来研究什么的
- 事务可以保证避免数据处于一种不合理的中间状态;
- 利用事务可以实现多个用户对共享资源的同时访问。
例如:转账
A 给 B转账,只能是 A 的钱减少并且 B 的钱增多了,或者转账失败,其他情况都是不合理的。
(2)事务和线程的关系
- 事务也是通过锁来解决很多问题的;
- 线程同步就是通过锁来解决的。
(3)事务和第三方插件的关系
- 直接使用事务库技术难度很大,很多人是借助第三方插件来实现。
- 第三方插件要想完成预期的功能,一般必须借助数据库中的事务机制。
2.什么是事务
一系列操作要么全部执行成功,要么全部执行失败,这就是事务。
3.如何创建事务
4.事务三种运行模式
5.总结事务的四大特性
事务必须具备以下四个属性,简称ACID属性
- 原子性:事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。
- 一致性:当事务完成时,数据必须处于一致状态,要么处于开始状态要么处于结束状态不允许出现中间状态。
- 隔离性:指当前的事务与其他未完成的事务是隔离的。在不同的隔离级别下,事务的读取操作,可以得到的结果是不同的。
- 持久性:事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性。
6.注意问题
不能在 Sql Server 2000 中单独使用 commit; rollback; 语句
delete from dept2 where deptno = 50;
commit --error
Rollback -- error
7.给初学者的一点建议
事务重在理解概念;
如果不是数据库dba,初学者对事物的语法细节不需要深究。
8.例子
create table bank
(
customerEname nvarchar(200),
currentMoney money check(currentMoney >= 1)
)
insert into bank values('张三', 1000);
insert into bank values('李四',1);
select * from bank;
若把张三的1000元打入李四的账户中,但是违背了currentMoney >= 1的约束。
update bank set currentMoney = currentMoney -1000 where customerEname = '张三';--error
update bank set currentMoney = currentMoney +1000 where customerEname = '李四';
结果:
所以用事务实现:
begin transaction
declare @errorSum int
set @errorSum = 0
update bank set currentMoney = currentMoney - 1000
where customerEname = '张三'
set @errorSum = @errorSum + @@ERROR
update bank set currentMoney = currentMoney + 1000
where customerEname = '李四'
set @errorSum = @errorSum + @@ERROR
if (@errorSum <> 0)
begin
print '转账失败'
rollback transaction
end