SQL SERVER-8-视图|事务|索引

1.视图
--视图是一张虚拟表,他表示一张表的部分数据或者多张表的综合数据,其结构和数据是建立在堆表的查询基础上的
--视图在操作上和表没有任何区别,但是他们的本质是不同的,数据表存储数据,但是视图是不存储数据的(sql server的索引视图除外,索引视图是存储数据的)
--视图的目的是方便查询,所以一般情况下是不能对视图进行增删改的操作的

--视图一般分为普通视图和索引视图
--普通视图是不存储数据的,但是索引视图是存储数据的


--创建一个视图(普通视图)
create view vw_Employees
as
select
    e1.EmployeeId as EmpId,
    e1.LastName as LastName,
    e1.FirstName as FirstName,
    e1.ReportsTo as ReportsTo,
    e2.FirstName as ReportsToName
from Employees as e1
left join Employees as e2 on e1.ReportsTo=e2.EmployeeId

--查询一下
select * from vw_Employees


--注意:在子查询,或视图等中不能使用order by子句,除非指定了top语句
--否则会报错:除非另外还指定了TOP 或者FOR XML,否则,ORDER BY子句在视图,内联函数,派生表,子查询,公用表表达式中无效
--这是因为视图是一个结果集,而一旦order by之后就是一个有序的集合了

--这里是修改了视图vw_Employees
--直接使用order by 是不行的,但是如果使用 top 100 percent 返回100%的数据的时候,则是可以使用的
--但是这时候是没有意义的,如下,order by 查询的时候是按降序排序的,但是直接top之后再使用视图查询则排序又变成了升序
--这是应为top 把有序的集合变成了一个无需的结果集
alter view vw_Employees
as
select
    top 100 percent
    e1.EmployeeId as EmpId,
    e1.LastName as LastName,
    e1.FirstName as FirstName,
    e1.ReportsTo as ReportsTo,
    e2.FirstName as ReportsToName
from Employees as e1
left join Employees as e2 on e1.ReportsTo=e2.EmployeeId
order by EmpId desc


2.事务
--强调的是一个过程,整个过程都不能出错,如果那一步出错了就把整个过程都给回滚,保持一致性
--比如转账,扣款和收钱两步要成功都成功,要失败都失败

select * from bank;
--一个人扣1000元
update bank set balance=balance -1000 where cid='0001'
--另外一个人收到1000元
update bank set balance=balance +1000 where cid='0002'
--如上两步,如果其中一步操作失败,而另一个执行成功
--会导致一个人的钱扣了,但是另一个人没有接收到钱
--或者一个人的钱没有扣除成功,但是另一个人的钱增加了(这个好 。。。)


--把这两句话放到一个事务中
begin transaction    
    --定义一个变量,用来保存操作是否成功的表示号
    declare @sumErrors int
    --设置初始值为0
    set @sumErrors=0
    --执行扣款操作
    update bank set balance=balance-1190 where cid='0001'
    --立刻验证一下这句话是否执行成功了,把返回的错误信息标识与定义的变量相加
    set @sumErrors=@sumErrors+@@error
    --执行转入操作
    update bank set balance=balance+1190 where cid='0002'
    --把错误信息表示号与定义的变量相加
    set @sumErrors=@sumErrors+@@error
    
    --验证是否执行成功
    if @sumErrors=0
    begin
        --表示没有出错
        --开始提交事务,transaction可以省略
        commit transaction
    end
    else
    begin
        --否则表示在操作的过程中出现了错误,回滚操作的数据,transaction可以省略
        rollback transaction
    end
    
    
--默认Sql Server是自动提交事务
--在执行完操作语句之后,会直接commit提交
insert ....
commit ..


--锁定
--新开一个事务
begin transaction
--执行修改操作
update TblClass set tclassName='Black Seven' where tclassId=24
--这时候如果不进行提交,(不执行下面的提交语句)
--直接在对该表进行查询操作,则查询会一直处于等待状态,而无法返回查询结果
--这是应为在进行修改的时候会对表进行加锁,使表被独占,而无法在才被其他操作所使用,只要执行了提交,查询结果会立刻显示出来
--select * from TblClass
commit transaction


--事务一旦打开就只有两种结果
--要么执行完毕提交操作,要么回滚事务撤销所有操作

--事务的特性
--1.原子性,事务必须是原子工作单位,对于数据的操作要么全部执行,要么全部不执行
--2.一致性,事务在执行之后,数据库中的数据必须保持一致状态
         --比如在转账的时候,转入和转出之后的总金额必须相同的
--3.隔离性,由并发事务所做的修改,必须与其他任何并发事务是隔离的
         --事务识别数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一并发事务修改它之后的状态,事务不会识别中间状态的数据
--4.持久性,事务完成之后,对系统的影响将是永久的
         --一旦事务提交完成,数据库中的数据就不会再改变了,在提交之前应为可能会出错回滚,所以数据还是不固定的


3.索引
--为了提高查询的数据,他是对数据进行了排序,然后可以根据一定的算法快速定位到数据行找到需要的数据
--这里的查找不仅限于select,删除和更相信的时候应为有where条件的存在,在语句执行之前也是有查找的过程,找到需要操作哪个数据
--所以这里的查找在select,delete,update的时候都有

--索引的分类
--1.聚集索引(聚簇索引),指索引实际存储的顺序,和表中物理存储的数据是相同的,找到该索引之后直接指向磁盘的空间位置,效率会比较高
--一个表中只能有一个聚集索引,应为磁盘的位置是固定的,既然已经存在一个聚集索引,再创建的话保存的顺序还是相同的,所以没必要创建多个聚集索引
--一般在建表以后要先建一个聚集索引,然后在建立其他索引
--其他索引依赖于聚集索引
--建立聚集索引的时候尽量避免选择那些频繁更新的列,否则排序以及索引所对应的地址都会改变,会降低性能
--2.非聚集索引(非聚簇索引),非聚集索引根据值获取聚集索引对应的值,然后根据聚集索引获取对应的磁盘空间的地址,之后再找到相应大的数据


--不要在比较大的字段上面创建索引
--比如下面的类型的字段,最好不要创建索引
--ntext
--text
--varchar(max)
--nvarchar(max)


--索引是为了降低读取磁盘的IO操作的次数
--应为磁盘的读取效率是比较低的,但是读取内存的效率是比较高的


--如果有多个索引存在
--在执行操作的时候查询优化器会对查询进行优化,找到最佳的索引并使用
--所以在进行查询操作的时候不要指定使用哪个索引
--有可能指定的索引效率并不是最优的,反而会消耗更多的时间


--没有索引的时候执行查询,获取查询时间
--如果多次执行,之后的执行时间会稍微短一些,应为缓存的存在
select * from TestIndex1002 where c4>700 and c4<1800
order by c4 desc

--创建聚集索引
--为表TestIndex1002的c4列创建一个聚集索引
--创建了聚集索引之后再次查询,时间会变短,读取次数会明显减少
--在c4列创建索引,在查询的时候就需要使用该字段,否则索引不会起效果
create clustered index ic4 on TestIndex1002(c4)

--创建非聚集索引
--在表TestIndex1003的c3字段创建一个非聚集索引
create index ic3 on TestIndex1003(c3)

--删除索引,需要指定表名.索引名称
--下面的删除语句删除了TestIndex1003上面的ic3索引
drop index TestIndex1003.ic3

猜你喜欢

转载自blog.csdn.net/m0_37532448/article/details/82868127