--上节回顾
--1.什么是事务
--2.事务的特征
--原子性、一致性、隔离性、持久性
--3.与事务相关的t-sql命令
--开启事务:begin transaction
--提交事务:commit transaction
--回滚事务:rollback transaction


----------------视图------------------
--首先思考一个问题:查询上机记录信息。
--计算机名、会员名称、上机开始时间、上机结束时间、金额


select  cp.chvComputerName, ci.chvUserName, ri.dtmStart, ri.dtmEnd, ri.mnyFee
from TblRecordInfo as ri--as表示为表取别名
inner join TblCardInfo as ci on ri.intCardId=ci.intCardId--内连接用inner join,同时应该为两张表指定连接字段
inner join TblComputer as cp on ri.intComputerId=cp.intComputerId

--评价:上述书写sql查询语句的方式太繁琐,每次书写的时候都会感觉很复杂

--思考:到底有木有一种非常方便的操作方式,能够实现一样的查询效果

--答案:肯定有:视图来解决

--什么是视图

--注意点:
--1.视图中的数据并没有保存在视图中,它仅仅保留查询的结果
--  这些记录是保存在表当中的

--如何创建视图,创建视图有相应的语法
create view view_RecordDetail
as
  select  cp.chvComputerName, ci.chvUserName, ri.dtmStart, ri.dtmEnd, ri.mnyFee
  from TblRecordInfo as ri--as表示为表取别名
  inner join TblCardInfo as ci on ri.intCardId=ci.intCardId--内连接用inner join,同时应该为两张表指定连接字段
  inner join TblComputer as cp on ri.intComputerId=cp.intComputerId
 
 --如何使用视图:使用方式和表一样
 select * from view_recorddetail
 go
 
 --视图是不是只能用来进行查询操作???
 --不是的,视图也可以用来进行新增\修改\删除
 
 --利用学生信息表进行视图的增删改操作
 create table TblStudent
 (
   intStudentId int primary key identity,
   chvStudentName nvarchar(30) not null,
   dtmBirthday datetime null,
   chvCeilPhone nvarchar(11) not null
 )
 go
 
 --创建视图:学生id、学生姓名、学生出生日期
 create view view_Student
 as
   select intstudentid, chvstudentname,dtmbirthday from TblStudent
  
 go

--通过视图完成对学生信息的新增
insert into view_student
(chvstudentname,dtmbirthday)
values
('zhangsan', '1989-9-9')
go
--上述sql会执行失败,原因是:学生的手机号不能为空

--如果修改视图
alter view view_student
as
   select intstudentid, chvstudentname,dtmbirthday, chvCeilPhone from TblStudent
go  
--新增数据
insert into view_student
(chvstudentname,dtmbirthday, chvCeilPhone)
values
('zhangsan', '1989-9-9','13698766666')
go
--验证,数据是在视图中还是在表中
select * from TblStudent;
go
select * from view_student
 
--通过视图进行数据修改

update view_student
  set chvceilphone = '13666666666'
where chvstudentname = 'zhangsan'
go

select * from view_student
go

--通过视图删除数据
delete from view_student
where chvstudentname='zhangsan'
go

select * from view_student;
select * from TblStudent;
go

--如何删除视图
--如何视图存在,则删除;否则不执行删除操作
if exists (select 1 from sys.sysobjects where name='view_student')
begin
  print '视图存在,即将删除...'
  drop view view_student
end
else
begin
  print '视图不存在'
end

alter view view_RecordDetail
as
  select cp.intComputerId, ci.intCardId,  cp.chvComputerName, ci.chvUserName, ri.dtmStart, ri.dtmEnd, ri.mnyFee
  from TblRecordInfo as ri--as表示为表取别名
  inner join TblCardInfo as ci on ri.intCardId=ci.intCardId--内连接用inner join,同时应该为两张表指定连接字段
  inner join TblComputer as cp on ri.intComputerId=cp.intComputerId
 
select * from view_recorddetail
go

--如果执行下面的语句:
--A:失败  B:tblcomputer中的记录被删除 
--c:recoredinfo表中的记录被删除  d:B+C
delete from view_recorddetail
where intComputerId=2
--答案:A  
--原因:视图或函数 'view_recorddetail' 不可更新,因为修改会影响多个基表。


--是否是只要视图由多张表组成,那么就不能执行删除操作
--否定的,是可以删除的,只是要满足指定的条件

 

 


 

posted on 2012-07-23 17:23  游长江  阅读(606)  评论(0编辑  收藏  举报