diff --git "a/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.14 \347\254\254\344\270\203\350\212\202\350\257\276-\345\210\206\351\241\265\344\270\216\347\264\242\345\274\225.md" "b/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.14 \347\254\254\344\270\203\350\212\202\350\257\276-\345\210\206\351\241\265\344\270\216\347\264\242\345\274\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..3b00e9851b557ae335be0bdb4efc8bdc4dea3dfe --- /dev/null +++ "b/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.14 \347\254\254\344\270\203\350\212\202\350\257\276-\345\210\206\351\241\265\344\270\216\347\264\242\345\274\225.md" @@ -0,0 +1,120 @@ +### 一,分页 + +#### 1,top分页 + +```SQL +select top n * from 表名 where 列名 between x and y; +``` + +#### 2,row_number分页 + +==row_number() over (order by)== + +```sql +select row_number over(order by 列名 asc/desc) from 表名 +``` + +**over()括号里的分组以及排序的执行晚于 where 、group by、 order by ** + +```sql +--第@x*(@x-1)+1页数据 +--每页有@x*@y条数据 +declare @x int,@y int +select * from (select *,ROW_NUMBER() over(order by id asc) as number from 表名 ) as tb1 +where number between @x*(@x-1)+1 and @x*@y; + +--列 +select StuName 姓名,ROW_NUMBER() over(order by score desc) 排名,score 分数 from StuScore +join stuinfo on StuInfo.StuID = StuScore.StuID +where subject = 'Java' +``` + +#### 3、ROW_NUMBER(),RANK(),DENSE_RANK() 的区别 + +* ROW_NUMBER()函数生成的排序根据排序子句给出**递增连续的序号** + +* RANK()函数生成的排序根据排序子句给出**递增的序号,但是存在并列并且跳空** + +* DENSE_RANK() 函数生成的排序根据排序子句给出**递增的序号,但是存在并列不跳空** + + + + + +### 二,索引 + +#### 1,概念 + +* 索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的特殊数据库结构,它是某个表中一列或若干列值的集合 + +#### 2,优点 + +* 提高查询速度 +* 保证数据记录的唯一性 +* 查询优化靠索引起作用 +* 提高order by, group by 执行速度 + +##### (1)创建索引 + +```sql +--非聚集索引 +create index IDX_列名1_列名2_列名3... on 表名(列名1,列名2,列名3...) +select * from + 表名 with(index=IDX_列名1_列名2_列名3...h) where.... +``` + +##### (2)查看表格中存在的索引 + +```sql +exsc sp_helpindex + 表名 +``` + +##### (3) 删除索引 + +```sql +drop index IDX_(需要删除的索引列名) on 列名 +``` + + + +#### 3,分类 + +* 聚集索引,非聚集索引 +* 按照数据唯一性分类:唯一索引(create unique IDX_name on 表名(列名))、非唯一索引 +* 按键列个数区分:单列索引,多列索引 + + + +#### 4,==聚集索引==(聚类索引、簇集索引) + +* 根据数据行的键值在表或视图中的排序存储这些数据行,**每个表只有一个聚集索引**。聚集索引是一种对磁盘上实际数据重新组织以按指定的一列或多列值排序(类似字典中的拼音索引)(物理存储顺序)。 + +```sql +--聚集索引 +create index IDX_列名 on 表名(列名) +select * from + 表名 with(index=IDX_列名)where.... +``` + + + +#### 5,==非聚集索引==(非聚类索引、非簇集索引) + +* 具有独立于数据行的结构,包含非聚集索引键值,**且每个键值项都有指向包含该键值的数据行的指针**。(类似字典中的偏旁部首索引)(逻辑存储顺序)。 + +```sql +--非聚集索引 +create index IDX_列名1_列名2_列名3... on 表名(列名1,列名2,列名3...) +select * from + 表名 with(index=IDX_列名1_列名2_列名3...h) where.... +``` + + + +#### 6, 使用索引的注意事项 + +- 使用**聚集索引的查询效率要比非聚集索引的效率要高**,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。 +- **非聚集索引在查询的时候可以的话就避免二次查询**,这样性能会大幅提升。 +- 不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好 +- **在where后使用or,导致索引失效(尽量少用or)** +- 使用like ,like查询是以%开头,以%结尾不会失效 +- 不符合最左原则(多列索引) +- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 +- **使用in导致索引失效** \ No newline at end of file