目录
[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.1 索引的定义](#2.1 索引的定义)
[2.2 索引的分类](#2.2 索引的分类)
[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.4 T-SQL创建视图
1. 原则
-
只能在当前数据库中创建视图
-
视图的名称需遵循标识符的规则 ,且在其所在的命名空间(通常是数据库本身)内必须是唯一的。不能与表名称相同。
-
不能创建临时视图;不能使用临时表或表变量创建视图;可以基于视图创建视图。
-
视图定义 中的SELECT子句不可以包含ORDER BY ,除非有一个TOP字句。
-
视图定义中的SELECT子句不能包含INTO关键字(因为视图本身并不存储数据)、OPTION子句。
-
如果某个视图依赖于已删除的表或视图,当有人使用视图时,报错。
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. 通过视图修改基本表
-
对数据的任何更新(update、insert、delete),都只能引用一个基本表的列。
-
如果视图仅包含某些列 ,当进行insert时,若另外的列不允许为空且没有默认值时 ,报错。
-
若创建(或修改)视图时,加了WITH CHECK OPTION,通过视图修改基本表 时,必须满足创建视图的select语句中的where中的条件
-
当视图依赖于多个表 时,不能insert,delete,一次只能update一个表,
-
视图中修改的列 必须是直接引用表中 的列的基础数据。如:视图中是平均分,那么没办法通过视图修改表。
-
被修改的列不应受在创建视图时的GROUP BY,HAVING,DISTINCT,TOP的影响。如:视图中是前几名的分数,那么修改到了分数,那么前几名就可能变了。
1.7 T-SQL删除视图
sql
DROP VIEW view_name
2、索引
2.1 索引的定义
索引包含由表或视图中的一列或多列生成的键,这些键存储在一个B树中,使用索引可以快速、高效地查找与键值关联的行。
2.2 索引的分类
索引有唯一索引 (索引列不能有相同的记录 ),非唯一索引 ,单列索引 (索引列只有一列 ),复合索引。
1.聚集索引
聚集索引 会对表和视图 进行物理排序 ,只能有一个。表中没有聚集索引 时,主键列 会作为 一个聚集索引。
2. 非聚集索引
非聚集索引不会对表和视图进行物理排序,如果表中不存在聚集索引,则表是未排序的。
2.3 索引的优点
-
加快 数据的检索速度。
-
创建唯一索引,可以使表中的每一行不同。(唯一性约束)
-
加速表的连接。
-
可以减少分组和排序 的时间。
-
查询优化器会利用索引来提高查询性能。
但是,也有一些缺点:
-
维护 索引,会消耗时间。
-
太多 的索引,会消耗物理空间。
2.4 T-SQL创建索引
1. 索引创建的位置的建议
-
经常需要搜索的列。
-
主键 和外键。
-
经常要排序的列。
-
经常在WHERE中使用的列。
-
连接 的列和使用聚合函数的列。
不建议使用索引的地方:
-
记录少的列
-
列的修改成本大于检索成本的列
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
注意:要指定是哪个表的索引。