--上節回顧
--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' 不可更新,因為修改會影響多個基表。
--是否是只要視圖由多張表組成,那么就不能執行刪除操作
--否定的,是可以刪除的,只是要滿足指定的條件
?
?
?