From 8f3f3e8f60a8289909895c1c2f2aeeb95fec6f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9B=85=E8=8A=B8?= <2863128930@qq.com> Date: Wed, 14 Sep 2022 12:01:23 +0000 Subject: [PATCH] 22 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李雅芸 <2863128930@qq.com> --- .../9.14\347\264\242\345\274\225.md" | 85 +++++++++++++++++++ ....8\345\255\220\346\237\245\350\257\242.md" | 81 ++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 "22\346\235\216\351\233\205\350\212\270/\347\254\224\350\256\260/9.14\347\264\242\345\274\225.md" create mode 100644 "22\346\235\216\351\233\205\350\212\270/\347\254\224\350\256\260/9.8\345\255\220\346\237\245\350\257\242.md" diff --git "a/22\346\235\216\351\233\205\350\212\270/\347\254\224\350\256\260/9.14\347\264\242\345\274\225.md" "b/22\346\235\216\351\233\205\350\212\270/\347\254\224\350\256\260/9.14\347\264\242\345\274\225.md" new file mode 100644 index 0000000..08ee24f --- /dev/null +++ "b/22\346\235\216\351\233\205\350\212\270/\347\254\224\350\256\260/9.14\347\264\242\345\274\225.md" @@ -0,0 +1,85 @@ +#### 索引 + +索引类型 + +``` +唯一索引:表上一个字段或者多个字段的组合建立的索引,这些字段组合起来能够确定唯一,允许存在空值(只允许存在一条空值) +非唯一索引:表上一个字段或者多个字段的组合建立的索引,可以重复,不需要唯一 +主键索引:(主索引)根据主键pk_clolum(length)建立索引,不允许重复,不允许空值; +聚合索引:表中记录的物理顺序与键值的索引顺序相同 +非聚合索引:表中记录的物理顺序与键值的索引顺序无关 +全文索引:在某个字段设置全文索引后,根据特定语法查找满足条件的字段; +普通索引:用表中的普通列构建的索引,没有任何限制 +组合索引:用多个列组合 构建的索引,但是在使用过程中有诸多规则,遵循最左前缀原则,顺序至关重要 +Hash索引(Memory存储引擎)是通过索引列的值计算出hashCode,之后在相应的物理位置存取索引列的值,由于hashCode的唯一性,因此Hash索引不能进行范围查找或者是顺序查找 +``` + +##### 索引的创建与使用 + +索引的创建 + +```sql +--01创建索引基本语法 +CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] +INDEX ON ( [ASC|DESC][,...n]) + + +``` + +索引的使用 + +```sql +--聚集索引(clustered):主键,一张表里只能有一个聚集索引 +--非聚集(nonclustered):-张表可以有多个非聚集 +--查找Java,60 90之间 +select*from StuScore where score between 60 and 90 +--索引 +--创建索引:默认创建的是非聚集索引 + create nonclustered index IDX_Subject +on stuscore(Subject) +with fillfactor = 40 +create nonclustered indexIDX_Score +on stuscore(Score) +with fillfactor = 40 +--普通查询 +select*from StuScore where score between 60 and 90 +--使用索引:数据量少的情况 +select*from Stuscore with(index=IDX_score) where score between 60 and 90 +--查看哪张表有什么索引 +exec sp_helpindex stuscore + + +``` + +索引的删除 + +```sql +-- 方法一: +alter table examination_info drop index uniq_idx_exam_id; +alter table examination_info drop index full_idx_tag; +``` + + + +```sql +-- 方法二: +drop index uniq_idx_exam_id on examination_info; +drop index full_idx_tag on examination_info; +``` + +#### 使用索引的注意事项 + +- 使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。 +- 非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。 +- 不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好 +- 在where后使用or,导致索引失效(尽量少用or) +- 使用like ,like查询是以%开头,以%结尾不会失效 +- 不符合最左原则(多列索引) +- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 +- 使用in导致索引失效 + +row_ mumber:连续不跳空 + +rank:并列跳空 + +dense_rark :并列不跳空 \ No newline at end of file diff --git "a/22\346\235\216\351\233\205\350\212\270/\347\254\224\350\256\260/9.8\345\255\220\346\237\245\350\257\242.md" "b/22\346\235\216\351\233\205\350\212\270/\347\254\224\350\256\260/9.8\345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000..a392108 --- /dev/null +++ "b/22\346\235\216\351\233\205\350\212\270/\347\254\224\350\256\260/9.8\345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,81 @@ +#### 子查询 + +###### 标量子查询 : + +**通常可以使用连接查询替代** + +标量子查询是指子查询返回的是**单一值**,如一个数字或一个字符串。标量子查询的结果就像一个常量一样,可以用于 SELECT、WHERE、GROUP BY、HAVING 以及 ORDER BY 等子句中。 + +```sql +select tb.col1, + tb.col2, + --下面的代码是重复的,表和连接条件都类似,只是最后显示的字段不同 + (select x1 from t where t.id = tb.id) as x1, + (select x2 from t where t.id = tb.id) as x2, + (select x3 from t where t.id = tb.id) as x3, + (select x4 from t where t.id = tb.id) as x4, + ... +from tb +``` + +###### 列子查询 + +**列子查询是指子查询返回的结果集是N行1列**,该结果通常来自对表某个字段的查询结果,带in关键字的子查询是最常用的一类子查询,在使用in关键字进行查询时,子查询语句返回的结果应该是一个数据列中的多个值,如果仅返回1个数值,则可用标量子查询代替。 + +```sql +例1:select t_reader.fname,t2.fyearpublished,t2.fname + + from t_reader,(select * from t_book where fyearpublished < 1800) t2; +``` + +###### 行子查询 + +行子查询是指子查询返回的结果集是1行N列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。 + +```sql +-- Oracle、MySQL 以及 PostgreSQL 实现 +SELECT emp_name, dept_id, job_id + FROM employee + WHERE (dept_id, job_id) = (SELECT dept_id, job_id FROM employee WHERE emp_name = '孙乾') + AND emp_name != '孙乾'; +``` + +###### 表子查询(from子查询) + +表子查询是指子查询返回是M行N列的结果集,查询语句可嵌套在FROM关 +键字后,且需要定义别名。 + +```sql +SELECT emp_name + FROM employee + WHERE job_id IN (SELECT job_id FROM employee WHERE dept_id = 3); + +emp_name| +--------| +孙尚香 | +孙丫鬟 | +``` + +IN 运算符用于判断查询条件中的字段取值是否位于子查询返回的列表之中。 + +##### 按位置分类 + +###### 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 '没有' +``` + +SQL中exists与in的使用及效率: + + a:通常采用exists要比in效率高,因为in不走索引 + + b:看实际情况:in适合于外表大而内表小的情况;而exists相反 + + c:当a表数据与b表数据一样大时,in与exists效率差不多,可选其一 \ No newline at end of file -- Gitee