SQL-视图丶索引

SQL-视图

视图中的内容是由查询定义来的,并且视图和查询都是通过SQL语句定义的,它们有着许多相同和不同之处。
存储:视图存储为数据库设计的一部分,而查询则不是。视图可以禁止所有用户访问数据库中的基表,而要求用户只能通过视图操作数据。这种方法可以保护用户和应用程序不受某些数据库修改的影响,同样也可以保护数据表的安全性。
排序:可以排序任何查询结果,但是只有当视图包括TOP子句时才能排序视图。
加密:可以加密视图,但不能加密查询。
视图就是将通过SQL语句查询到的结果表存储起来,就是一张虚拟表

视图的创建

下面在SQL Server Management Studio中创建视图“View_Student”,具体操作步骤如下。
(1)启动SQL Server Management Studio,并连接到SQL Server 2012中的数据库。
(2)在“对象资源浏览器”中展开“数据库”节点,展开指定的数据库“db_2012”。
(3)鼠标右键单击“视图”选项,在弹出的快捷菜单中选择“新建视图”命令。
(4)进入“添加表”对话框。在列表框中选择学生信息表“Student”,单击“添加”按钮,然后单击“关闭”按钮关闭该窗体
(5)进入“视图设计器”界面。在“表选择区”中选择“所有列”选项,单击执行按钮,视图结果区中自动显示视图结果。
(6)单击工具栏中的“保存”按钮,弹出“选择名称”对话框。在“输入视图名称”文本框中输入视图称“View_Student”,单击“确定”按钮即可保存该视图。

视图的删除

用户可以删除视图。删除视图时,底层数据表不受影响,但会造成与该视图关联的权限丢失。
下面介绍如何在“SQL Server Management Studio”管理器中删除视图,具体操作步骤如下。
(1)启动SQL Server Management Studio,并连接到SQL Server 2012中的数据库。
(2)在“对象资源浏览器”中展开数据库节点,展开指定的数据库“db_2012”。
(3)展开“视图”节点,鼠标右键单击要删除的视图“View_Student”,在弹出的快捷菜单中选择“删除”命令。

使用CREATE VIEW语句创建视图

CREATE VIEW Score_View
---WITH  进行加密
AS
SELECT Student.Sname AS 姓名,Course.Cname AS 科目,SC.score AS 成绩 FROM SC JOIN Student ON SC.SId=Student.SId JOIN Course ON Course.CId=SC.CId 

SELECT * FROM Score_View

如果原来的视图定义是用WITH ENCRYPTION或CHECK OPTION创建的,那么只有在ALTER VIEW中也包含这些选项时,这些选项才有效。

使用ALTER VIEW语句修改视图

使用alter view是对视图的修改,使用update是通过视图对数据表做修改。

ALTER VIEW Score_View
AS
SELECT Course.Cname AS 科目,SC.score AS 成绩 FROM SC JOIN Course ON SC.CId=Course.CId 
SELECT * FROM Score_View
UPDATE Score_View SET 成绩=80 WHERE 科目='英语'
SELECT * FROM Score_View
SELECT * FROM SC

通过UPDATE语句会改变所有的数据(视图中以及原始表中)

使用DROP VIEW语句删除视图

在单击“全部除去”按钮删除视图以前,可以在“除去对象”对话框中单击“显示相关性”按钮,即可查看该视图依附的对象,以确认该视图是否为想要删除的视图。

使用存储过程sp_rename修改视图

使用sp_rename视图

EXEC sp_rename Score_View,SC_View

不能通过视图来更新数据有哪些原因

答:不能通过视图来更新数据应考虑以下情况:

  1. 如果两个基表中有同名称的字段,则不能更新数据,需指定具体表和字段。
  2. 如果有INSTEAD OF触发器,将执行INSTEAD OF触发器中的代码,而不执行提交的数据更新。
  3. 视图中的聚合函数或GROUP BY子句将部分数据汇总,无法确定更新哪些记录。
  4. 创建视图时如果使用了联接,则UPDATE语句只能更新其中的一个表。

索引

索引是为了加速对表中数据行的检索而创建的一种分散存储结构。它是针对一个表而建立的,每个索引页面中的行都含有逻辑指针,指向数据表中的物理位置,以便加速检索物理数据。因此,对表中的列是否创建索引,将对查询速度有很大的影响。一个表的存储是由两部分组成的,一部分用来存放表的数据页,另一部分存放索引页。从中找到所需数据的指针,然后直接通过该指针从数据页面中读取数据,从而提高查询速度。

索引的优点

  1. 创建唯一性索引,保证数据库表中每一行数据的唯一性。
  2. 大大加快数据的检索速度,这也是创建索引的最主要原因。
  3. 加速表与表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
  4. 在使用分组和排序子句进行数据检索时,同样可以减少查询中分组和排序的时间。
  5. 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。

索引的缺点

  1. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
  2. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引,那么需要的空间就会更大。
  3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,降低了数据的维护速度。

聚集索引的实现原理

聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。

只有当表包含聚集索引时,表中的数据行才按排列顺序存储。如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。

除了个别表之外,每个表都应该有聚集索引。聚集索引除了可以提高查询性能之外,还可以按需重新生成或重新组织来控制表碎片。

聚集索引按下列方式实现:

PRIMARY KEY和UNIQUE约束

在创建PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。主键列不允许空值。

在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制UNIQUE约束。如果不存在该表的聚集索引,则可以指定唯一聚集索引。

独立于约束的索引

指定非聚集主键约束后,您可以对非主键列的列创建聚集索引

索引视图

若要创建索引视图,请对一个或多个视图列定义唯一聚集索引。视图将具体化,并且结果集存储在该索引的页级别中,其存储方式与表数据存储在聚集索引中的方式相同。

非聚集索引的实现原理

非聚集索引具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。

从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。

下面对非聚集索引的结构进行详细地说明。表a中的数据是按表b中的数据进行顺序存储的,在表a中为“地址代码”列建立索引,“指针地址”列是每条记录在表中的存储位置(通常称为指针),当查询地址代码为01的信息时,先在索引表中查找地址代码01,然后根据索引表中的指针地址(在这里指针地址为2)找到第2条记录,这样就很大地提高了查询速度。

在这里插入图片描述

创建索引

恶意脚本内容的嵌入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值