diff --git "a/02\350\260\242/\344\275\234\344\270\232/9.7.md" "b/02\350\260\242/\344\275\234\344\270\232/9.7.md" new file mode 100644 index 0000000000000000000000000000000000000000..ceab9134680d20553d0732e2f4930ac4ad71980e --- /dev/null +++ "b/02\350\260\242/\344\275\234\344\270\232/9.7.md" @@ -0,0 +1,35 @@ +--1. 关羽的银行卡号为"6225547858741263",查询出余额比关羽多的银行卡信息,显示卡号,身份证,姓名,余额。 +select CardNo,AccountCode,RealName,CardMoney from BankCard +join AccountInfo on AccountInfo.AccountId = BankCard.AccountId +where CardMoney>any(select CardMoney from BankCard where CardNo = '6225547858741263') +--2. 从所有账户信息中查询出余额最高的交易明细(存钱取钱信息)。 +select CardExchange.* from CardExchange +join BankCard on BankCard.CardNo = CardExchange.CardNo +where CardMoney=(select max(CardMoney) from BankCard) +--3. 查询有取款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 +select BankCard.CardNo,AccountCode,RealName,CardMoney from CardExchange +join BankCard on BankCard.CardNo = CardExchange.CardNo +join AccountInfo on AccountInfo.AccountId = BankCard.AccountId +where MoneyOutBank>0 + +update BankCard set CardMoney = CardMoney - 5000 where CardNo = '6225547854125656' +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('6225547854125656',0,5000,GETDATE()) +--4. 查询出没有存款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 +select BankCard.CardNo,AccountCode,RealName,CardMoney from CardExchange +join BankCard on BankCard.CardNo = CardExchange.CardNo +join AccountInfo on AccountInfo.AccountId = BankCard.AccountId +where MoneyInBank is null +--5. 关羽的银行卡号为"6225547858741263",查询当天是否有收到转账。 +select * from CardTransfer +where CardNoIn = '6225547858741263' +--6. 查询出交易次数(存款取款操作)最多的银行卡账户信息,显示:卡号,身份证,姓名,余额,交易数。 +select BankCard.CardNo,AccountCode,RealName,CardMoney,count(CardExchange.CardNo) 交易数 from CardExchange +join BankCard on BankCard.CardNo = CardExchange.CardNo +join AccountInfo on AccountInfo.AccountId = BankCard.AccountId +where CardExchange.CardNo=(select top 1 CardExchange.CardNo from CardExchange group by CardExchange.CardNo order by count(CardExchange.CardNo) desc) +group by CardExchange.CardNo,BankCard.CardNo,AccountCode,RealName,CardMoney +--7. 查询出没有转账交易记录的银行卡账户信息,显示卡号,身份证,姓名,余额。 +select CardNo,AccountCode,RealName,CardMoney from BankCard +join AccountInfo on AccountInfo.AccountId = BankCard.AccountId +where BankCard.CardNo!=any(select CardNoIn from CardTransfer) and BankCard.CardNo!=any(select CardNoOut from CardTransfer) \ No newline at end of file diff --git "a/02\350\260\242/\347\254\224\350\256\260/04\347\264\242\345\274\225\344\270\216\350\247\206\345\233\276.md" "b/02\350\260\242/\347\254\224\350\256\260/04\347\264\242\345\274\225\344\270\216\350\247\206\345\233\276.md" new file mode 100644 index 0000000000000000000000000000000000000000..0e5a31e9310a58f7ea68bf0f9ce57a08e4a9a191 --- /dev/null +++ "b/02\350\260\242/\347\254\224\350\256\260/04\347\264\242\345\274\225\344\270\216\350\247\206\345\233\276.md" @@ -0,0 +1,105 @@ +## 回顾 + +**嵌套子查询** + +- 使用IN和NOT IN 完成子查询 +- 使用EXISTS 和 NOT EXISTS 完成子查询 +- 使用SOME ANY ALL进行子查询 + +**排序函数** + +- ROW_NUMBER函数 +- RANK函数 +- DENSE_RANK函数 + +## 索引 + +#### 什么是索引? + +汉语字典中的汉字按页存放,一般都有汉语拼音目录(索引)、偏旁部首目录等我们可以根据拼音或偏旁部首,快速查找某个字词。 + +![](https://gitee.com/snailclass/tuchuang/raw/master/img/book1-2022-9-1310:41:20.png) + +索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的特殊数据库结构,它是某个表中一列或若干列值的[集合](https://so.csdn.net/so/search?q=集合&spm=1001.2101.3001.7020)和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到需要的内容。 + +**建立索引的作用如下**: + +- 提高查询速度 + +- 保证数据记录的唯一性 + +- 查询优化靠索引起作用 + +- 提高order by, group by 执行速度 + +#### 索引分类 + +**索引主要分为两类**: + +- **聚集索引(clustered)**:根据数据行的键值在表或视图中的排序存储这些数据行,每个表只有一个聚集索引。聚集索引是一种对磁盘上实际数据重新组织以按指定的一列或多列值排序(类似字典中的拼音索引)(物理存储顺序)。 + + ![img](https://gitee.com/snailclass/tuchuang/raw/master/img/%E5%9B%BE%E7%89%872-2022-9-1316:27:08.png) + +- **非聚集索引 (nonclusterted)**:具有独立于数据行的结构,包含非聚集索引键值,且每个键值项都有指向包含该键值的数据行的指针。(类似字典中的偏旁部首索引)(逻辑存储顺序)。 + + ![img](https://gitee.com/snailclass/tuchuang/raw/master/img/%E5%9B%BE%E7%89%872-2022-9-1316:27:08.png) + +**其它类型的索引**: + +- 按照数据唯一性分类:唯一索引、非唯一索引 +- 按键列个数区分:单列索引,多列索引 + +- 其他分类:索引视图、包含性列索引、全文索引、XML索引等 + +#### 索引的创建与使用 + +- 索引的创建 + +```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/02\350\260\242/\347\254\224\350\256\260/9.14.md" "b/02\350\260\242/\347\254\224\350\256\260/9.14.md" new file mode 100644 index 0000000000000000000000000000000000000000..45d5f4420b62d252a846dc1622b44bc49d7aab9f --- /dev/null +++ "b/02\350\260\242/\347\254\224\350\256\260/9.14.md" @@ -0,0 +1,28 @@ +SQL 索引(Index)用于提高数据表的查询速度。一个表可以创建多个索引,一个索引可以包含一个或者多个字段。 + +不使用索引,数据库引擎将遍历整个表。 + +从表面上看,索引类似于书的目录,在没有目录的情况下,要从书中查找某项内容就必须阅读全文,而有了目录之后,通过页码就可以很快定位到相关内容。 + +从本质上看,索引是根据表的一个或者多个字段生成的子表,该子表中的数据已经进行了排序。子表除了包含指定字段中的数据,还包含一个 rowid 列,用于存储当前记录在原始表中的位置。用户无法看到索引,它只是用来加快查询速度。 + +为了提高查询效率,便于后期维护,索引都是基于某种数据结构而创建的,比如 B+ 树、B- 树、位图等。 +索引的使用成本 +在表中插入、修改或者删除数据时,数据库引擎也必须维护索引,以保持索引和原始表的同步;也就是说,使用索引是有额外开销的。不适合的索引,或者过多的索引,都会降低插入、修改和删除数据的效率。 + +索引还会占用磁盘空间,增加 I/O 成本,过多的索引甚至会增加碎片。 + +鉴于以上两点,使用索引时应该遵循以下几条原则: +仅在被频繁检索的字段上创建索引。 +针对大数据量的表创建索引,而不是针对只有少量数据的表创建索引。 +通常来说,经常查询的记录数目少于表中总记录数据的 15% 时,可以创建索引。这个比例并不绝对,它与全表扫描速度成反比。 +尽量不要在有大量重复值得字段上建立索引,比如性别字段、季度字段等。 +语法 +在某个字段上创建索引的基本语法如下: +CREATE INDEX index_name +ON table_name ( column1, column2.....); +index_name 是索引的名字,以后在删除索引时会用到。 +删除索引 +删除索引请使用下面的 SQL 语句: +ALTER TABLE website +DROP INDEX myIndex; \ No newline at end of file diff --git "a/02\350\260\242/\347\254\224\350\256\260/9.7.md" "b/02\350\260\242/\347\254\224\350\256\260/9.7.md" new file mode 100644 index 0000000000000000000000000000000000000000..308697ed85a20a791f573894e7f64f5e041b084c --- /dev/null +++ "b/02\350\260\242/\347\254\224\350\256\260/9.7.md" @@ -0,0 +1,39 @@ +# 子查询 + +## 1.按结果分类 + +### 1.标量子查询 + +​ 标量子查询是指子查询返回的是单一值,如一个数字或一个字符串。 + +### 2.列子查询 + +​ 列子查询是指子查询返回的结果集是N行1列,该结果通常来自对表某个字段的查询结果,带in关键字的子查询是最常用的一类子查询,在使用in关键字进行查询时,子查询语句返回的结果应该是一个数据列中的多个值,如果仅返回1个数值,则可用标量子查询代替。 + +#### 1.In关键字 + +​ in代表:只要符合后面的条件就筛选出来。 + +#### 2.any关键字 + +#### 3.some关键字 + +#### 4.all关键字 + +​ >,<,= + +### 3.行子查询 + +​ 行子查询是指子查询返回的结果集是1行N列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。 + +### 4.表子查询 + +​ 1.from关键字 + +## 2.按位置分类 + +​ 1.from子查询 + +​ 2.where子查询 + +​ 3.wxists子查询 \ No newline at end of file diff --git "a/02\350\260\242/\347\254\224\350\256\260/9.8.md" "b/02\350\260\242/\347\254\224\350\256\260/9.8.md" new file mode 100644 index 0000000000000000000000000000000000000000..7a3369824f612ad350e2822fcf346349c06d2af5 --- /dev/null +++ "b/02\350\260\242/\347\254\224\350\256\260/9.8.md" @@ -0,0 +1,15 @@ +# exists子查询 + +关键字EXISTS构造子查询时,当子查询的结果集不为空时,则EXISTS返回的结果为TRUE,外层查询语句进行查询;当子查询的结果集为空时,则EXISTS返回的结果为FALSE,外层查询语句不进行查询。 + +# 排序函数 + +## 排序函数 + +排序函数 OVER( [分组子句] 排序子句[desc][asc ) + +排序子句 :ORDER BY 排序列,排序列… + +ROW_NUMBER()函数生成的排序根据排序子句给出递增连续的序号 +RANK()函数生成的排序根据排序子句给出递增的序号,但是存在并列并且跳空 +DENSE_RANK() 函数生成的排序根据排序子句给出递增的序号,但是存在并列不跳空 \ No newline at end of file