视图和索引

目录

1、视图

[1.1 视图的定义](#1.1 视图的定义)

[1.2 视图的分类](#1.2 视图的分类)

[1. 标准视图](#1. 标准视图)

[2. 索引视图](#2. 索引视图)

[3. 分区视图](#3. 分区视图)

[4. 系统视图](#4. 系统视图)

[1.3 视图的优点](#1.3 视图的优点)

[1.4 T-SQL创建视图](#1.4 T-SQL创建视图)

[1. 原则](#1. 原则)

[2. T-SQL创建视图](#2. T-SQL创建视图)

[1.5 T-SQL修改视图](#1.5 T-SQL修改视图)

[1.6 视图的使用](#1.6 视图的使用)

[1. 查询](#1. 查询)

[2. 通过视图修改基本表](#2. 通过视图修改基本表)

[1.7 T-SQL删除视图](#1.7 T-SQL删除视图)

2、索引

[2.1 索引的定义](#2.1 索引的定义)

[2.2 索引的分类](#2.2 索引的分类)

1.聚集索引

[2. 非聚集索引](#2. 非聚集索引)

[2.3 索引的优点](#2.3 索引的优点)

[2.4 T-SQL创建索引](#2.4 T-SQL创建索引)

[1. 索引创建的位置的建议](#1. 索引创建的位置的建议)

[2. T-SQL创建索引](#2. T-SQL创建索引)

[3. T-SQL创建索引视图](#3. T-SQL创建索引视图)

[2.5 T_SQL查看索引](#2.5 T_SQL查看索引)

[2.6 T-SQL删除索引](#2.6 T-SQL删除索引)


1、视图

1.1 视图的定义

视图所对应的数据不是以视图结构存储在数据库中 ,而是存储在视图所引用的表中

可以通过视图修改基本表

1.2 视图的分类

1. 标准视图

用户自定义的视图。

2. 索引视图

当对视图创建索引时,SQL Server会将视图的结果集存储为一个物理表,这个表被称为索引视图

3. 分区视图

在一台或多台服务器间水平连接一组成员中的分区数据。看起来像来自同一个表。

分为本地分区视图和分布式分区视图:在本地分区视图中,所有相关的表和视图,都连接在同一个SQL Server实例上;在分布式分区视图中,至少有一个相关表是连接在不同的(远程)服务器上的。

4. 系统视图

公开目录元数据。

1.3 视图的优点

  1. 方便:视图已经对表进行预查询。在预查询的基础上查询,更方便。

  2. 数据逻辑独立性:应用程序与数据库的逻辑结构是相互独立的。当构成视图的基本表结构发生改变时,只需要修改视图中的查询语句,使视图显示的数据结构保持不变,从而基于视图的应用程序无须改变。

  3. 安全性:通过对不同的用户定义不同的视图,使用户只能查询和修改与自己相关的数据。

1.4 T-SQL创建视图

1. 原则
  1. 只能在当前数据库中创建视图

  2. 视图的名称需遵循标识符的规则 ,且在其所在的命名空间(通常是数据库本身)内必须是唯一的。不能与表名称相同

  3. 不能创建临时视图;不能使用临时表或表变量创建视图;可以基于视图创建视图

  4. 视图定义 中的SELECT子句不可以包含ORDER BY除非有一个TOP字句

  5. 视图定义中的SELECT子句不能包含INTO关键字(因为视图本身并不存储数据)、OPTION子句。

  6. 如果某个视图依赖于已删除的表或视图,当有人使用视图时,报错。

2. T-SQL创建视图
sql 复制代码
CREATE VIEW [schema_name.]view_name[(column_name[,...n])]
AS
select_statement
[WITH CHECK OPTION]

column_name:给视图中的列取名。

AS:指定视图要执行的操作。不要忘了

WITH CHECK OPTION:保证通过视图修改基本表 时,必须满足创建视图的select语句中的where中的条件。如:创建一个男生的视图,此时不能插入女生的记录。

创建一个view_sg视图,显示sno,sname,gender,sage

sql 复制代码
use teaching
go
create view view_sg
as
select sno,sname,gender,sage
from student

1.5 T-SQL修改视图

与创建视图一样,只是把CREATE换成了ALTER,

注意:修改时,继续包含WITH CHECK OPTION,才有作用,删了,就没有这个作用了。

1.6 视图的使用

1. 查询

和表的查询一样,只是from table,变成了 from view。

2. 通过视图修改基本表
  1. 对数据的任何更新(updateinsertdelete),都只能引用一个基本表的列。

  2. 如果视图仅包含某些列 ,当进行insert时,若另外的列不允许为空且没有默认值时报错

  3. 若创建(或修改)视图时,加了WITH CHECK OPTION通过视图修改基本表 时,必须满足创建视图的select语句中的where中的条件

  4. 视图依赖于多个表 时,不能insert,delete,一次只能update一个表

  5. 视图中修改的列 必须是直接引用表中列的基础数据。如:视图中是平均分,那么没办法通过视图修改表。

  6. 被修改的列不应受在创建视图时的GROUP BY,HAVING,DISTINCT,TOP的影响。如:视图中是前几名的分数,那么修改到了分数,那么前几名就可能变了。

1.7 T-SQL删除视图

sql 复制代码
DROP VIEW view_name

2、索引

2.1 索引的定义

索引包含由表或视图中的一列或多列生成的键,这些键存储在一个B树中,使用索引可以快速、高效地查找与键值关联的行。

2.2 索引的分类

索引有唯一索引 (索引列不能有相同的记录 ),非唯一索引单列索引 (索引列只有一列 ),复合索引

1.聚集索引

聚集索引 会对表和视图 进行物理排序只能有一个。表中没有聚集索引 时,主键列 会作 一个聚集索引

2. 非聚集索引

非聚集索引不会对表和视图进行物理排序,如果表中不存在聚集索引,则表是未排序的。

2.3 索引的优点

  1. 加快 数据的检索速度

  2. 创建唯一索引,可以使表中的每一行不同。(唯一性约束)

  3. 加速表的连接

  4. 可以减少分组和排序时间

  5. 查询优化器会利用索引来提高查询性能

但是,也有一些缺点:

  1. 维护 索引,会消耗时间

  2. 太多 的索引,会消耗物理空间

2.4 T-SQL创建索引

1. 索引创建的位置的建议
  1. 经常需要搜索的列。

  2. 主键外键

  3. 经常要排序的列。

  4. 经常在WHERE中使用的列

  5. 连接 的列和使用聚合函数的列。

不建议使用索引的地方:

  1. 记录少的列

  2. 列的修改成本大于检索成本的列

2. T-SQL创建索引
sql 复制代码
CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED] INDEX index_name
ON [table_name|view_name] (column_name[ASC|DESC] [,...n])

UNIQUE:唯一性,默认不唯一

CLUSTERED**|** NONCLUSTERED:聚集索引|非聚集索引,默认NONCLUSTERED (非聚集索引)。

ASC**|** DESC:升序|降序,默认ASC (升序)。

为student表建立一个按sage升序的非聚集索引。

sql 复制代码
use teaching
go
create index asc_sage
on student(sage)
3. T-SQL创建索引视图

在 SQL Server 中,只有带有****WITH SCHEMABINDING 的视图才能创建聚集索引。这是因为聚集索引要求数据物理存储在特定的顺序中,而 WITH SCHEMABINDING 确保了视图定义与基础表架构的稳定性,从而允许 SQL Server 实现这一物理存储要求。

不带 WITH SCHEMABINDING 的视图通常只能有非聚集索引。

创建一个索引female_view视图,并创建一个按sno升序的唯一聚集索引。

sql 复制代码
use teaching
go
create view female_view
with schemabinding
as
select sno,sname,gender,specialty 
from dbo.student -- 要指定架构名(schema_name),默认是dbo
where gender = '女'
go
create unique clustered index asc_q_sno
on female_view(sno)

2.5 T_SQL查看索引

sql 复制代码
use teaching
go
exec sp_helpindex student -- 查看student表中的索引
-- 或
exec sp_help student  -- student表中更详细的信息

2.6 T-SQL删除索引

sql 复制代码
DROP INDEX table_name.index_name

注意:指定哪个表的索引

相关推荐
Lzc7746 天前
数据库的概念和操作
数据库原理与应用·sql server 2014