diff --git "a/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/6-9.14\347\264\242\345\274\225.Markdown" "b/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/6-9.14\347\264\242\345\274\225.Markdown" new file mode 100644 index 0000000000000000000000000000000000000000..7794e0fa23171d826bf69afcf2e7a02272f05b5c --- /dev/null +++ "b/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/6-9.14\347\264\242\345\274\225.Markdown" @@ -0,0 +1,92 @@ +# 索引 +### 定义 + +索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的特殊数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到需要的内容。 +索引分为两种:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引) +聚集索引:正文内容本身就是一种按照一定规则排列的目录 + 注:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。 +非聚集索引:目录纯粹是目录,正文纯粹是正文的排序方式 + + +### 优点 + + 提高查询速度(数据少时,体现不出,多用于查询多数据时) + + 保证数据记录的唯一性 + + 查询优化靠索引起作用 + + 提高order by, group by 执行速度 + +### 缺点 + + 带索引的表在数据库中需要更多的存储空间 + 操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新 + +### 聚合索引和非聚合索引的区别 +|聚集索引 | 非聚集索引| +|---|---| +|每个表只允许有一个聚集索引 | 最多可以有249个非聚集索引| +|物理地重排表中的数据以符合索引约束 | 创建一个键值列表键值指向数据在数据页中的位置| +|用于经常查找数据的列 | 用于从中查找单个值的列| + + +### 创建索引 + +语法:默认为聚集索引 +```SQL +create [unique][clustered][nonclustered] --索引类型 +index IX_name --索引名称IX_开头或IDX_开头 +on table_name(字段)--表示在哪张表的哪个字段上 +[with fillfactor = x]--填充因子(表示启用x%) +``` + +### 类型 +```SQL +unique 唯一索引 +clustered 聚集索引 +nonclustered 非聚集索引 +table_name 数据表名,也可以是视图名 +fillfactor 设置填充因子的大小,指定0-100之间的值,该值指示索引页填满的空间所占百分比,一般为30 +``` + +### 原则: + +按照下列标准选择建立索引的列 + + 频繁搜索的列 + 经常用作查询选择的列 + 经常排序、分组的列 + 经常用作连接的列(主键/外键) + +不要使用的列 + + 创建索引仅包含几个不同值的列 + 表中仅包含几行 + +### 删除索引 + +语法: +```SQL +drop index table_name.IDX_name +``` +表和索引名称之间,用"."分隔 +删除表时,该表的所有索引同时会被删除 + +### 使用索引查询 +```SQL +如:指定按索引IDX_Student_Sname查询 +select * from Student +with(index=IDX_Student_Sname) +where Sname = "张三" +``` +使用索引的注意事项 + + 使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。 + 非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。 + 不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好 + 在where后使用or,导致索引失效(尽量少用or) + 使用like ,like查询是以%开头,以%结尾不会失效 + 不符合最左原则(多列索引) + 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 + 使用in导致索引失效 diff --git "a/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/7-9.15\350\247\206\345\233\276.Markdown" "b/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/7-9.15\350\247\206\345\233\276.Markdown" new file mode 100644 index 0000000000000000000000000000000000000000..67db2f51230da89600cc829d85b3c9f1536246db --- /dev/null +++ "b/17 \344\276\257\351\224\237\351\223\226/\347\254\224\350\256\260/7-9.15\350\247\206\345\233\276.Markdown" @@ -0,0 +1,57 @@ +# 视图 +### 创建视图 + +``` +create view 视图名 +as +select */(字段1,字段2,...) from 表名 +``` + +### 使用视图 +``` +select * from 视图名 +``` +### 删除视图 +``` +drop view 视图名 +``` + +### 修改视图 +```sql +alter view 视图名 as select 字段名(s) from表名 where 条件; +如: +alter view s_view as select* from Student where sname like '%铖%'; +``` +### 常见的视图形式 + + 行列子集视图:去掉了某些行和某些列,但保留了主键 + +--建立信息学院学生的视图 +```SQL +create view V_StuMajor(学号,姓名,学院,专业) +as +(select stu_num ,name ,school ,major from tb_student where school='软件工程学院') + + with check option 视图 + +--建立信息学院学生的视图,并要求通过该视图进行的更新操作只涉及信息学院的学生 +create view V_StuMajor(学号,姓名,学院,专业) +as +(select stu_num ,name ,school ,major from tb_student where school='软件工程学院') +with check option +``` +### 带表达式的视图 +定义一个反映学生年龄的视图 +```SQL +create view V_StuAge(学号,姓名,年龄,学院,专业) +as +(select stu_num ,name ,year(getdate())-year(birth),school,major from tb_student) +select * from V_StuAge +``` + +### 查询视图 +```SQL +select *from 视图名 +例: +select * from V_StuMajor +``` \ No newline at end of file