diff --git "a/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9-14\345\210\206\351\241\265\344\270\216\347\264\242\345\274\225.md" "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9-14\345\210\206\351\241\265\344\270\216\347\264\242\345\274\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..250d26dd1cffe379c09e2c1afbea2e795864f57b --- /dev/null +++ "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9-14\345\210\206\351\241\265\344\270\216\347\264\242\345\274\225.md" @@ -0,0 +1,82 @@ +## 分页查询 + +#### 分页方案一 + +**使用top分页** + +```sql +declare @PageSize int = 5 -- 每页5条 +declare @PageIndex int = 2 --第2页 +select top(@PageSize) * from Student +where Stuid not in (select top(@PageSize)*(@PageIndex-1)) StuId from Student +``` + + + +#### 分页方案二 + +**使用row_number分页** + +```sql +declare @PageSize int = 5 +declare @PageIndex int = 3 +select * from +(select ROW_NUMBER() over(order by StuId) RowId,*from Student) as Temp +where RowId between (@PageIndex-1)*@PageSize+1 and @PageIndex*PageSize +``` + +## 索引分类 + +**索引主要分为两类**: + + 聚集索引(clustered)**:根据数据行的键值在表或视图中的排序存储这些数据行,每个表只有一个聚集 索引。聚集索引是一种对磁盘上实际数据重新组织以按指定的一列或多列值排序(类似字典中的拼音索引)(物理存储顺序) + +**非聚集索引 (nonclusterted)**:具有独立于数据行的结构,包含非聚集索引键值,且每个键值项都有指向包含该键值的数据行的指针。(类似字典中的偏旁部首索引)(逻辑存储顺序)。 + +#### 索引的创建与使用 + +- 索引的创建 + +```sql +--01创建索引基本语法 +CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] +INDEX ON ( [ASC|DESC][,...n]) + +--练习:为DBSTUDENT创建score字段索引 + +--练习:查找姓名为MikeSullivan、年龄17岁用户的peopleid +--分别使用单列索引和多列索引 +``` + +- 索引的使用 + +```sql +--使用索引进行查询 +``` + +- 索引的删除 + +```sql +--删除索引 +``` + + + +TIPS: + +- 索引信息存储在系统视图sys.indexes中 +- 可以使用系统存储过程:exec sp_helpindex查看当前表的索引 +- 填充因子:一页需要填充多少数据。 + + + +#### 使用索引的注意事项 + +- 使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。 +- 非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。 +- 不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好 +- 在where后使用or,导致索引失效(尽量少用or) +- 使用like ,like查询是以%开头,以%结尾不会失效 +- 不符合最左原则(多列索引) +- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 +- 使用in导致索引失效 diff --git "a/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9-15 \350\247\206\345\233\276.md" "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9-15 \350\247\206\345\233\276.md" new file mode 100644 index 0000000000000000000000000000000000000000..4e8d3e1c264bd2cb95cb819c492ab7dab94e5f0b --- /dev/null +++ "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9-15 \350\247\206\345\233\276.md" @@ -0,0 +1,95 @@ +## 视图 + +#### 关系(Relations) + +三种类型关系: + +- 表(Table)--基表,存储关系(Base Tables,Sorted relations) +- 视图(Views)--虚拟关系(Virtual relations)(不是物理存在的是虚拟的) +- 临时结果(Temporary results)--用于构建**子查询**的结果 + + + +**视图的作用** + +视图能够简化用户的操作 + +视图使用户能以多种角度看待同一数据 + +视图对重构数据库提供了一定的逻辑独立性 + +视图能够对机密数据提供安全保护 + +#### 基于视图的操作 + +##### 定义视图 + +```sql +--建立视图 +create view <视图名> [(<列名>[,<列名>]...)] + as <子查询> [with check option] +``` + +##### 常见的视图形式 + +- 行列子集视图:去掉了某些行和某些列,但保留了主键 + +```sql +--建立信息学院学生的视图 +create view V_StuMajor(学号,姓名,学院,专业) +as +(select stu_num ,name ,school ,major from tb_student where school='信息学院') +go + +``` + +- with check option 视图 + +```sql +--建立信息学院学生的视图,并要求通过该视图进行的更新操作只涉及信息学院的学生 +``` + + + +- 带表达式的视图 + +```sql +--定义一个反映学生年龄的视图 +create view V_StuMajor(学号,姓名,学院,专业) +as +(select stu_num ,name ,school ,major from tb_student where school='信息学院') +with check option +go +``` + +##### 查询视图 + +```sql +select * from V_StuMajor +``` + + + +##### 更新视图 + +```sql +update V_StuMajor set 姓名='王博文' where 学号=16130201 +``` + + + +##### 删除视图 + +```sql +drop view <视图名> +--该语句从数据字典中删除指定的视图定义 +--由该视图导出的其他视图仍在数据字典中,但不能使用,需要删除 +--删除基表时,由该基表导出的所有视图定义都必须显示删除 +``` + +#### 视图的设计原则 + +- 以 select * 方式创建的视图:可扩充性差,应尽可能避免 + + + diff --git "a/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9-8 exists\345\255\220\346\237\245\350\257\242.md" "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9-8 exists\345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..c6ede24c49dc1301a545218e2278803ff9a75472 --- /dev/null +++ "b/29\345\220\264\346\230\212\347\273\251/\347\254\224\350\256\260/9-8 exists\345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,14 @@ +###### exists子查询 + +关键字EXISTS构造子查询时,当子查询的结果集不为空时,则EXISTS返回的结果为TRUE,外层查询语句进行查询;当子查询的结果集为空时,则EXISTS返回的结果为FALSE,外层查询语句不进行查询。 + +```sql +--(1)查询学生表(tb-student)中,是否有学生读者的姓名是"黄弘" +if exists(select stu_num from tb_record where stu_num in (select stu_num from tb_student where name='黄弘') and return_time is null) + print '有' +else + print '没有' + +--(2)查询书目表(tb-bibliography)中,库存数为0的书目名称(name) +``` +