SQL server学习(四)T-SQL编程之事务、索引和视图
今天来分享下T-SQL高级编程中的事务、索引、视图,可以和之前的SQL server系列文章结合起来。
一、事务
事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行,事务是一个不可分割的工作逻辑单元
这样说可能太笼统,看个实例就会清晰很多,比如银行转账业务,相信大家都办理过。
create table bank (customerName char(10), --顾客姓名currentMoney money --当前余额 ) go alter table bankadd constraint CK_currentMoney check(currentMoney>=1) go insert into bank(customerName,currentMoney)values('张三',1000) insert into bank(customerName,currentMoney)values('李四',1)--模拟银行转账: /*--转账测试:张三转账1000元给李四--*/ --我们可能会这样这样编写语句 --张三的账户少1000元,李四的账户多1000元 UPDATE bank SET currentMoney=currentMoney-1000WHERE customerName='张三' UPDATE bank SET currentMoney=currentMoney+1000WHERE customerName='李四' GO --再次查看转账后的结果。 SELECT * FROM bank GO
这样写的SQL代码,实际结果会出现,张三的钱没少,而李四的钱多了1000,是因为添加的约束条件,money要>=1,才导致这样结果。
转账那个人的钱没少,而另一方却收到了钱,这样的话,银行岂不亏死,所以,这样的代码明显是不合理的。根据事务概念,是要么执行成功,要是失败,只有这两种结果,而且是同步的。
代码改进为如下:
使用事务解决: BEGIN TRANSACTION /*--定义变量,用于累计事务执行过程中的错误--*/ DECLARE @errorSum INT SET @errorSum=0 --初始化为0,即无错误 /*--转账:张三的账户少1000元,李四的账户多1000元*/ UPDATE bank SET currentMoney=currentMoney-1000WHERE customerName='张三' SET @errorSum=@errorSum+@@error UPDATE bank SET currentMoney=currentMoney+1000WHERE customerName='李四' SET @errorSum=@errorSum+@@error --累计是否有错误IF @errorSum<>0 --如果有错误<>表示不等于与!=的效果一样BEGINprint '交易失败,回滚事务'ROLLBACK TRANSACTIONEND ELSEBEGINprint '交易成功,提交事务,写入硬盘,永久的保存'COMMIT TRANSACTION END GO print '查看转账事务后的余额' SELECT * FROM bank GO
添加事务后,就会保证数据的正确性了,到这,我想大家已经明白事务的好处了。
事务的四大属性,简称ACID属性
原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行
一致性(Consistency):当事务完成时,数据必须处于一致状态
隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性
创建事务
开始事务:BEGIN TRANSACTION 提交事务:COMMIT TRANSACTION 回滚(撤销)事务:ROLLBACK TRANSACTION
一旦事务提交或回滚,则事务结束。
判断某条语句执行是否出错:@@ERROR的返回值为0表示没错
使用全局变量@@ERROR;
@@ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计;
如: SET @errorSum=@errorSum+@@error
事务分类:
显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用的事务类型
隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成时,再下一个 T-SQL 语句又将启动一个新事务
自动提交事务:这是 SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务,如果成功执行,则自动提交;如果错误,则自动回滚
二、索引
索引根据索引键查找定位数据行
索引:是SQL Server编排数据的内部方法。它为SQL Server提供一种方法来编排查询数据 。
索引页:数据库中存储索引的数据页;索引页类似于汉语字(词)典中按拼音或笔画排序的目录页。
索引的作用:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能。
索引类型
唯一索引:唯一索引不允许两行具有相同的索引值
主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个,比如:拼音
非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个,比如:偏旁
创建索引
CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED] --唯一索引,聚集索引或非聚集索引 INDEX index_name ON table_name (column_name…) [WITH FILLFACTOR=x]
其中:
UNIQUE表示唯一索引,可选
CLUSTERED、NONCLUSTERED表示聚集索引还是非聚集索引,可选
FILLFACTOR表示填充因子,指定一个0到100之间的值,该值指示索引页填满的空间所占的百分比
创建索引举例:
USE stuDB GO IF EXISTS (SELECT name FROM sysindexes WHERE name = 'IX_writtenExam')DROP INDEX stuMarks.IX_writtenExam /*--笔试列创建非聚集索引:填充因子为30%--*/ CREATE NONCLUSTERED INDEX IX_writtenExamON stuMarks(writtenExam)WITH FILLFACTOR= 30 GO /*-----指定按索引 IX_writtenExam 查询----*/ SELECT * FROM stuMarks with(INDEX=IX_writtenExam)WHERE writtenExam BETWEEN 60 AND 90
创建索引的指导原则
请按照下列标准选择建立索引的列。
该列用于频繁搜索
该列用于对数据进行排序
请不要使用下面的列创建索引:
列中仅包含几个不同的值。
表中仅包含几行。为小型表创建索引可能不太划算,因为SQL Server在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长
三、视图
视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上,视图中并不存放数据,而是存放在视图所引用的原始表(基表)中,同一张原始表,根据不同用户的不同需求,可以创建不同的视图
视图的用途:
筛选表中的行
防止未经许可的用户访问敏感数据
降低数据库的复杂程度
将多个物理数据库抽象为一个逻辑数据库
SQL Server中允许用户创建视图,在同一原始数据表的基础上,为不同的用户选择不同的列,从而达到不同用户的需求。
创建视图语法:
CREATE VIEW view_name AS<select语句>
举例:
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'view_stuInfo_stuMarks') 检查视图是否存在 DROP VIEW view_stuInfo_stuMarks 删除视图 GO CREATE VIEW view_stuInfo_stuMarks 创建视图ASSELECT 姓名=stuName,学号=stuInfo.stuNo,笔试成绩 =writtenExam,机试成绩=labExam,平均分=(writtenExam+labExam)/2FROM stuInfo LEFT JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo GO SELECT * FROM view_stuInfo_stuMarks 使用视图
本文仅代表作者观点,系作者@温一壶清酒发表。欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。文章出处:http://www.cnblogs.com/hong-fithing/
转载于:https://www.cnblogs.com/hong-fithing/p/7656137.html
SQL server学习(四)T-SQL编程之事务、索引和视图相关推荐
- 【SQL Server 学习系列】-- sql 随机生成中文名字
[SQL Server 学习系列]-- sql 随机生成中文名字 原文:[SQL Server 学习系列]-- sql 随机生成中文名字 1 DECLARE @fName TABLE(Id INT I ...
- 【SQL Server学习笔记】SQL SERVER 视图
视图包括:普通视图,索引视图,分布式分区视图. 关于视图的最佳实践: A.对视图进行性能优化的过程和普通的select查询语句的优化过程是一样的. B.不要在一个视图的定义中调用另一个视图. C.如果 ...
- SQL Server 学习系列之五
SQL Server 学习系列之五 SQL Server 学习系列之一(薪酬方案+基础) SQL Server 学习系列之二(日期格式问题) SQL Server 学习系列之三(SQL 关键字) SQ ...
- SQL Server之 (四) ADO增删查改 登录demo 带参数的sql语句 插入自动返回行号
SQL Server之 (四) ADO增删查改 登录demo 带参数的sql语句 插入自动返回行号 自己学习笔记,转载请注明出处,谢谢!---酸菜 1.什么是ADO.NET ADO.NET是一组 ...
- sql server 学习教程
sql server 学习教程 SQL Server 系统数据库 master model msdb tempdb 索引 定义 分类 唯一索引 主键索引 聚集索引(Clustered) 非聚集索引(N ...
- [转]推荐国外SQL Server学习网站
由于SQL Server在国外的应用比较成熟,因此国外的SQL Server的优秀学习站点很多,下面几个是自己长期关注的,里面的文章原创性高.知识性强,实在是学习SQL Server "居家 ...
- SQL SERVER学习记录
SQL SERVER学习记录 //创建数据库,请先在D盘手动建立一个 backup的文件夹 create database sl on (name = 'sl',filename = 'd:\back ...
- sql server学习路径地址
联机丛书2005:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2005/ms130214(v=sql.90) 联 ...
- [学习SQL SERVER 2005系列]图解SQL SERVER2005的安装
[学习SQL SERVER 2005系列]图解SQL SERVER2005的安装 前言: [学习SQL SERVER 2005系列]准备把学习2005的一些心得整理出来,和大家分享,共同学习一起提高. ...
- SQL server学习_两表对照
SQL server学习--两表对照 自己闲来无事的时候就写了一个存储过程,用来对比两张表的相同性. 1.这个存储过程主要是用来查看数据量大的前提下,在不知道删除了什么数据,想要恢复. 2.这个存储过 ...
最新文章
- android 图片 编辑app,图片编辑工具手机版下载-图片编辑工具app下载8.33.107安卓官方版-西西软件下载...
- simple-spring-memcached统一缓存的使用实例4
- php webstorm,webstorm和phpstorm的区别
- 讲讲我和Spring创始级程序员共同review代码的故事
- 英语语法---感叹词详解
- 两年前端菜鸟回忆篇(1)
- 夯实Java基础(二十二)——Java8新特性之Lambda表达式
- 如何成为像 Facebook 创始人马克·扎克伯格一样的大佬?
- 基于麻雀搜索算法优化的SVM回归预测 - 附代码
- Scratch3.0的作品如何转换成H5或.exe
- 英语发音之音标2---去尾法(a和其他6个辅音字母总共7个字母发音)
- Word自动给图片编号
- 删除PDF其中几页的方法
- 关于ie中使用a标签无法打开(预览)pdf问题
- 在网上买中国工商银行基金
- CorelDRAW x8警告您所用的软件疑似非法盗版软件,软件功能3天内将被永久停用,解决方法教程
- JAVA出现警告无法读取 AppletViewer 属性文件的解决方法
- Goland自定义头部注释,增加author和data等(学习笔记,不作教程)
- Python正则表达式匹配字符串中的数字
- 降水数据下载地址汇总