MSSQL事务与视图
2016-05-27 16:04
465 查看
use MySchool
go
select * from Student; --63
select * from Result; --103
--没有参加考试的学员信息
--公共:32
select * from Student where exists
(select * from Result where StudentNo=Student.StudentNo)
--in 替换
select *from Student where StudentNo in (select StudentNo from result)
--
select distinct Student.StudentNo,StudentName from Student inner join Result
on Student.StudentNo = Result.StudentNo
--不同:31
select *from Student where StudentNo not in (select StudentNo from result)
--表连接不能替换子查询 63?(其实学生表)
select distinct Student.StudentNo,StudentName from Student inner join Result
on Student.StudentNo <> Result.StudentNo
if exists (select * from sysobjects where name='bank')
drop table bank
CREATE TABLE bank
(
customerName CHAR(10), --顾客姓名
currentMoney MONEY --当前余额
)
GO
ALTER TABLE bank
ADD CONSTRAINT CK_currentMoney
CHECK(currentMoney >= 1)
GO
INSERT INTO bank(customerName, currentMoney)
VALUES('张三', 1000)
INSERT INTO bank(customerName, currentMoney)
VALUES('李四', 1)
select * from bank;
--假定张三的账户直接转账1000元到李四的账户
update bank set currentMoney = currentMoney-1000 where customerName='张三 ';
update bank set currentMoney = currentMoney+1000 where customerName='李四 ';
--(一)事务?
--事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作
--多个操作作为一个整体向系统提交,要么都执行、要么都不执行
--事务是一个不可分割的工作逻辑单元
--(二)事务必须具备以下四个属性,简称ACID 属性:
--原子性(Atomicity)
--一致性(Consistency)
--隔离性(Isolation)
--永久性(Durability)
--(三)使用SQL语句管理事务
--1)开始事务
--begin transaction
--2)提交事务
--commit transaction
--3)回滚事务
--rollback transaction
一旦事务提交或回滚,则事务结束
判断某条语句执行是否出错:
使用全局变量@@ERROR
@@ERROR只判断当前一条T-SQL语句执行是否有错
为了判断事务中所有T-SQL语句是否有错,可以对错误进行累计
--事务可以嵌套
--(四)事务分类
a)显式事务
用BEGIN TRANSACTION明确指定事务的开始(最常用的事务类型)
B)隐性事务
通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开
其后的T-SQL语句自动启动一个新事务
提交或回滚一个事务后,下一个 T-SQL 语句又将启动一个新事务
C)自动提交事务
SQL Server 的默认模式
每条单独的 T-SQL 语句视为一个事务
SELECT * FROM bank;
begin transaction --开始事务
--声明变量累计错误号
declare @err int=0
update bank set currentMoney = currentMoney-1000 where customerName='张三 ';
--累计错误号
set @err =@err+@@ERROR
update bank set currentMoney = currentMoney+1000 where customerName='李四 ';
set @err =@err+@@ERROR --累计错误号
IF @err<>0 --如果SQL语句执行出错
BEGIN
PRINT '交易失败,回滚事务'
ROLLBACK TRANSACTION
END
ELSE
BEGIN
PRINT '交易成功,提交事务,写入硬盘,永久的保存'
COMMIT TRANSACTION
END
GO
PRINT '查看转账事务后的余额'
SELECT * FROM bank
GO
--800
begin transaction --开始事务
--声明变量累计错误号
declare @err int=0
update bank set currentMoney = currentMoney-800 where customerName='张三 ';
--累计错误号
set @err =@err+@@ERROR
update bank set currentMoney = currentMoney+800 where customerName='李四 ';
set @err =@err+@@ERROR --累计错误号
IF @err<>0 --如果SQL语句执行出错
BEGIN
PRINT '交易失败,回滚事务'
ROLLBACK TRANSACTION
END
ELSE
BEGIN
PRINT '交易成功,提交事务,写入硬盘,永久的保存'
COMMIT TRANSACTION
END
GO
PRINT '查看转账事务后的余额'
SELECT * FROM bank
GO
--二、什么是视图
--(1)视图是一张虚拟表
--表示一张表的部分数据或多张表的综合数据
--其结构和数据是建立在对表的查询基础上
--(2)视图中不存放数据
--数据存放在视图所引用的原始表中
--(3)一个原始表,根据不同用户的不同需求,可以创建不同的视图
--视图的用途
-- 筛选表中的行
-- 防止未经许可的用户访问敏感数据
-- 降低数据库的复杂程度
-- 将多个物理数据库抽象为一个逻辑数据库
--使用T-SQL语句创建视图
--CREATE VIEW view_name
-- AS
-- <SELECT 语句>
--使用T-SQL语句删除视图
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'view_name')
DROP VIEW view_name
--使用T-SQL语句查看视图
SELECT * FROM view_name
-参加考试的学员信息
select * from Result
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student')
DROP VIEW vw_student
go
create view vw_student
as
select st.StudentNo,st.StudentName,r.subjectid,r.studentResult,r.examdate
from Student st,Result r
where st.StudentNo=r.StudentNo
select * from vw_student;
使用视图注意事项:
--(1)视图中可以使用多个表
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student')
DROP VIEW vw_student
go
create view vw_student
as
select distinct st.StudentNo 学号,st.StudentName 姓名,st.Sex 性别,g.GradeName 年级名称
,s.SubjectName 课程,r.StudentResult 成绩,r.ExamDate 考试日期
from Student st,Grade g,Subject s,Result r
where st.StudentNo=r.StudentNo
and g.GradeId = st.GradeId
and s.SubjectId = r.SubjectId
go
select * from vw_student;
--一个视图可以嵌套另一个视图
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student1')
DROP VIEW vw_student1
go
create view vw_student1
as
select * from vw_student where 年级名称='s2'
go
select *from vw_student1
--视图定义中的 SELECT 语句不能包括下列内容:
--(1)ORDER BY 子句,除非在 SELECT 语句的选择列表中也有一个 TOP 子句
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student2')
DROP VIEW vw_student2
go
create view vw_student2
as
--发生异常
--select * from vw_student where 成绩 is not null order by 成绩 desc;
select top 5 * from vw_student where 成绩 is not null order by 成绩 desc;
go
select *from vw_student2
--(2)INTO 关键字
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student2')
DROP VIEW vw_student2
go
create view vw_student2
as
--发生异常
--select * into mystudent from vw_student where 成绩 is not null
go
select *from vw_student2
--select *from mystudent;
--(3)引用临时表或表变量
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student2')
DROP VIEW vw_student2
go
create view vw_student2
as
--发生异常表变量
--declare @sex varchar(2)='女'
--select * from vw_student where 性别=@sex
--临时表不可以使用
select * from #my
go
select *from vw_student2
--创建临时表
--select * into #my from vw_student
select *from vw_student
--在视图中能否删除数据?(多张表数据)
delete from vw_student where 姓名='洛飞'
update vw_student set 年级名称='IT' where 姓名='洛飞'
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student2')
DROP VIEW vw_student2
go
create view vw_student2
as
select * from Grade;
go
select * from vw_student2
--在视图中能否删除数据?(1张表数据)==>基表数据(grade)
delete from vw_student2 where gradeid=10
go
select * from Student; --63
select * from Result; --103
--没有参加考试的学员信息
--公共:32
select * from Student where exists
(select * from Result where StudentNo=Student.StudentNo)
--in 替换
select *from Student where StudentNo in (select StudentNo from result)
--
select distinct Student.StudentNo,StudentName from Student inner join Result
on Student.StudentNo = Result.StudentNo
--不同:31
select *from Student where StudentNo not in (select StudentNo from result)
--表连接不能替换子查询 63?(其实学生表)
select distinct Student.StudentNo,StudentName from Student inner join Result
on Student.StudentNo <> Result.StudentNo
if exists (select * from sysobjects where name='bank')
drop table bank
CREATE TABLE bank
(
customerName CHAR(10), --顾客姓名
currentMoney MONEY --当前余额
)
GO
ALTER TABLE bank
ADD CONSTRAINT CK_currentMoney
CHECK(currentMoney >= 1)
GO
INSERT INTO bank(customerName, currentMoney)
VALUES('张三', 1000)
INSERT INTO bank(customerName, currentMoney)
VALUES('李四', 1)
select * from bank;
--假定张三的账户直接转账1000元到李四的账户
update bank set currentMoney = currentMoney-1000 where customerName='张三 ';
update bank set currentMoney = currentMoney+1000 where customerName='李四 ';
--(一)事务?
--事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作
--多个操作作为一个整体向系统提交,要么都执行、要么都不执行
--事务是一个不可分割的工作逻辑单元
--(二)事务必须具备以下四个属性,简称ACID 属性:
--原子性(Atomicity)
--一致性(Consistency)
--隔离性(Isolation)
--永久性(Durability)
--(三)使用SQL语句管理事务
--1)开始事务
--begin transaction
--2)提交事务
--commit transaction
--3)回滚事务
--rollback transaction
一旦事务提交或回滚,则事务结束
判断某条语句执行是否出错:
使用全局变量@@ERROR
@@ERROR只判断当前一条T-SQL语句执行是否有错
为了判断事务中所有T-SQL语句是否有错,可以对错误进行累计
--事务可以嵌套
--(四)事务分类
a)显式事务
用BEGIN TRANSACTION明确指定事务的开始(最常用的事务类型)
B)隐性事务
通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开
其后的T-SQL语句自动启动一个新事务
提交或回滚一个事务后,下一个 T-SQL 语句又将启动一个新事务
C)自动提交事务
SQL Server 的默认模式
每条单独的 T-SQL 语句视为一个事务
SELECT * FROM bank;
begin transaction --开始事务
--声明变量累计错误号
declare @err int=0
update bank set currentMoney = currentMoney-1000 where customerName='张三 ';
--累计错误号
set @err =@err+@@ERROR
update bank set currentMoney = currentMoney+1000 where customerName='李四 ';
set @err =@err+@@ERROR --累计错误号
IF @err<>0 --如果SQL语句执行出错
BEGIN
PRINT '交易失败,回滚事务'
ROLLBACK TRANSACTION
END
ELSE
BEGIN
PRINT '交易成功,提交事务,写入硬盘,永久的保存'
COMMIT TRANSACTION
END
GO
PRINT '查看转账事务后的余额'
SELECT * FROM bank
GO
--800
begin transaction --开始事务
--声明变量累计错误号
declare @err int=0
update bank set currentMoney = currentMoney-800 where customerName='张三 ';
--累计错误号
set @err =@err+@@ERROR
update bank set currentMoney = currentMoney+800 where customerName='李四 ';
set @err =@err+@@ERROR --累计错误号
IF @err<>0 --如果SQL语句执行出错
BEGIN
PRINT '交易失败,回滚事务'
ROLLBACK TRANSACTION
END
ELSE
BEGIN
PRINT '交易成功,提交事务,写入硬盘,永久的保存'
COMMIT TRANSACTION
END
GO
PRINT '查看转账事务后的余额'
SELECT * FROM bank
GO
--二、什么是视图
--(1)视图是一张虚拟表
--表示一张表的部分数据或多张表的综合数据
--其结构和数据是建立在对表的查询基础上
--(2)视图中不存放数据
--数据存放在视图所引用的原始表中
--(3)一个原始表,根据不同用户的不同需求,可以创建不同的视图
--视图的用途
-- 筛选表中的行
-- 防止未经许可的用户访问敏感数据
-- 降低数据库的复杂程度
-- 将多个物理数据库抽象为一个逻辑数据库
--使用T-SQL语句创建视图
--CREATE VIEW view_name
-- AS
-- <SELECT 语句>
--使用T-SQL语句删除视图
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'view_name')
DROP VIEW view_name
--使用T-SQL语句查看视图
SELECT * FROM view_name
-参加考试的学员信息
select * from Result
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student')
DROP VIEW vw_student
go
create view vw_student
as
select st.StudentNo,st.StudentName,r.subjectid,r.studentResult,r.examdate
from Student st,Result r
where st.StudentNo=r.StudentNo
select * from vw_student;
使用视图注意事项:
--(1)视图中可以使用多个表
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student')
DROP VIEW vw_student
go
create view vw_student
as
select distinct st.StudentNo 学号,st.StudentName 姓名,st.Sex 性别,g.GradeName 年级名称
,s.SubjectName 课程,r.StudentResult 成绩,r.ExamDate 考试日期
from Student st,Grade g,Subject s,Result r
where st.StudentNo=r.StudentNo
and g.GradeId = st.GradeId
and s.SubjectId = r.SubjectId
go
select * from vw_student;
--一个视图可以嵌套另一个视图
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student1')
DROP VIEW vw_student1
go
create view vw_student1
as
select * from vw_student where 年级名称='s2'
go
select *from vw_student1
--视图定义中的 SELECT 语句不能包括下列内容:
--(1)ORDER BY 子句,除非在 SELECT 语句的选择列表中也有一个 TOP 子句
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student2')
DROP VIEW vw_student2
go
create view vw_student2
as
--发生异常
--select * from vw_student where 成绩 is not null order by 成绩 desc;
select top 5 * from vw_student where 成绩 is not null order by 成绩 desc;
go
select *from vw_student2
--(2)INTO 关键字
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student2')
DROP VIEW vw_student2
go
create view vw_student2
as
--发生异常
--select * into mystudent from vw_student where 成绩 is not null
go
select *from vw_student2
--select *from mystudent;
--(3)引用临时表或表变量
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student2')
DROP VIEW vw_student2
go
create view vw_student2
as
--发生异常表变量
--declare @sex varchar(2)='女'
--select * from vw_student where 性别=@sex
--临时表不可以使用
select * from #my
go
select *from vw_student2
--创建临时表
--select * into #my from vw_student
select *from vw_student
--在视图中能否删除数据?(多张表数据)
delete from vw_student where 姓名='洛飞'
update vw_student set 年级名称='IT' where 姓名='洛飞'
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'vw_student2')
DROP VIEW vw_student2
go
create view vw_student2
as
select * from Grade;
go
select * from vw_student2
--在视图中能否删除数据?(1张表数据)==>基表数据(grade)
delete from vw_student2 where gradeid=10
相关文章推荐
- sql server 2012 数据库日志文件过大,怎么缩小?
- UNION运算符
- Redis
- 详解SQL Server连接(内连接、外连接、交叉连接)
- 连接Oracle11g时报错ORA-12541: TNS: 无监听程序
- Redis学习手册(Key操作命令)
- redis简单应用
- dede调用外部数据库信息
- mysql 高并发环境的解决方案
- SQLServer的数据类型
- 通过ssh隧道访问mysql,包括免密码操作
- 为写入性能优化:Redis
- C# ACCESS数据库链接
- Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作
- redis+twemproxy自动分片(一致性hash)
- Record is locked by another user --Oracle行锁解锁
- 关于SQL Server2000防火墙端口问题
- SQLite的初级研究
- sql优化见解
- MongoDB java 3.2.2.jar