From 18a9c72b5ac4911d7a84ad86069aff5c658d42e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E5=91=A8=E6=B3=BD=E5=BC=BA=E2=80=9D?= <“2944697776@qq.com”> Date: Tue, 13 Sep 2022 16:48:17 +0800 Subject: [PATCH] 12 --- .../\344\275\234\344\270\232/9.6.md" | 54 ++++++- .../2022-8-31\345\244\215\344\271\240.md" | 0 ...-R\345\205\263\347\263\273\345\233\276.md" | 0 .../2022-9-5\345\217\230\351\207\217.md" | 0 ...47\345\210\266\350\257\255\345\217\245.md" | 0 ...-7\345\255\220\346\237\245\350\257\242.md" | 139 ++++++++++++++++++ 6 files changed, 192 insertions(+), 1 deletion(-) rename "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/\345\244\215\344\271\240.md" => "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-8-31\345\244\215\344\271\240.md" (100%) rename "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/E-R\345\205\263\347\263\273\345\233\276.md" => "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-1E-R\345\205\263\347\263\273\345\233\276.md" (100%) rename "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/\345\217\230\351\207\217.md" => "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-5\345\217\230\351\207\217.md" (100%) rename "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/\351\200\273\350\276\221\346\216\247\345\210\266\350\257\255\345\217\245.md" => "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-6\351\200\273\350\276\221\346\216\247\345\210\266\350\257\255\345\217\245.md" (100%) create mode 100644 "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-7\345\255\220\346\237\245\350\257\242.md" diff --git "a/12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/9.6.md" "b/12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/9.6.md" index 9822810..9da6b58 100644 --- "a/12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/9.6.md" +++ "b/12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/9.6.md" @@ -5,6 +5,7 @@ declare @AccountId int set @AccountId=@@IDENTITY insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) values('6225547852125488',@AccountId,'123456',0,1) + --2. 需要求出张飞的银行卡卡号和余额,张飞身份证:420107199602034138 (1.使用连接查询,2.使用变量) 1. select CardNo 卡号,CardMoney 余额 from BankCard @@ -14,4 +15,55 @@ values('6225547852125488',@AccountId,'123456',0,1) 2. declare @AccountId int select @AccountId =(select AccountId from AccountInfo where AccountCode='420107199602034138') select CardNo 卡号,CardMoney 余额 from BankCard - where AccountId=@AccountId \ No newline at end of file + where AccountId=@AccountId + +--3.某用户银行卡号为“6225547854125656”,该用户执行取钱操作,取钱5000元,余额充足则进行取钱操作,并提示"取钱成功",否则提示“余额不足”。 +declare @balance money +select @balance=(select CardMoney from BankCard where CardNo='6225547854125656') +--可以取钱 +if @balance>=5000 + begin + update BankCard set CardMoney=CardMoney-5000 + where CardNo='6225547854125656' + insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) + values('6225547854125656',0,5000,GETDATE()) + end +--不能取钱 +else + begin + print'余额不足' + end +select*from CardExchange + +--4.查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”,并且根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户", +----显示列分别为卡号,身份证,姓名,余额,用户等级,银行卡状态。 +select CardNo 卡号,AccountCode 身份证号,RealName 姓名,CardMoney 余额 , +case + when CardMoney>=300000 then 'VIP用户' + else'普通用户' +end 用户等级, +case CardState + when 1 then '正常' + when 2 then '挂失' + when 3 then '冻结' + when 4 then '注销' + else '异常' +end 银行卡状态 +from BankCard +inner join AccountInfo on BankCard.AccountId=AccountInfo.AccountId + + + +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额, +case + when CardMoney < 300000 then '普通用户' + else 'VIP用户' +end 用户等级, +case + when CardState = 1 then '正常' + when CardState = 2 then '挂失' + when CardState = 3 then '冻结' + when CardState = 4 then '注销' + else '异常' +end 卡状态 +from BankCard inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId \ No newline at end of file diff --git "a/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/\345\244\215\344\271\240.md" "b/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-8-31\345\244\215\344\271\240.md" similarity index 100% rename from "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/\345\244\215\344\271\240.md" rename to "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-8-31\345\244\215\344\271\240.md" diff --git "a/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/E-R\345\205\263\347\263\273\345\233\276.md" "b/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-1E-R\345\205\263\347\263\273\345\233\276.md" similarity index 100% rename from "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/E-R\345\205\263\347\263\273\345\233\276.md" rename to "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-1E-R\345\205\263\347\263\273\345\233\276.md" diff --git "a/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/\345\217\230\351\207\217.md" "b/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-5\345\217\230\351\207\217.md" similarity index 100% rename from "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/\345\217\230\351\207\217.md" rename to "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-5\345\217\230\351\207\217.md" diff --git "a/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/\351\200\273\350\276\221\346\216\247\345\210\266\350\257\255\345\217\245.md" "b/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-6\351\200\273\350\276\221\346\216\247\345\210\266\350\257\255\345\217\245.md" similarity index 100% rename from "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/\351\200\273\350\276\221\346\216\247\345\210\266\350\257\255\345\217\245.md" rename to "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-6\351\200\273\350\276\221\346\216\247\345\210\266\350\257\255\345\217\245.md" diff --git "a/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-7\345\255\220\346\237\245\350\257\242.md" "b/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-7\345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000..37809da --- /dev/null +++ "b/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-7\345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,139 @@ +### 子查询 + +子查询概念 +子查询:sub query +子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块,当一个查询是另外一个查询的条件时,称之为子查询。可以理解为:在一条select语句中,嵌入了另外一条select语句,那么被嵌入的select语句称之为子查询语句。 + +子查询分类 + +1、按功能分: +标量子查询:子查询返回结果是一个数据(一行一列) +列子查询:返回结果是一个数据(一列多行) +行子查询:返回结果是一个数据(一行多列) +表子查询:返回结果是一个数据(多行多列) +exists子查询:返回结果是1或者0(类似布尔操作。mysql中没有布尔类型) + +2、按位置分: +where子查询:子查询出现的位置在where条件中 +from子查询:子查询出现的位置在from数据源中(其实就是做数据源) + +### 标量子查询 + +概念 +标量子查询:子查询的返回值必须只有一行记录,而且只能有一个列。 + +**语法** +基本语法:select * from 数据源 where 字段名 操作符 (select 字段名 from 数据源 where 条件判断); + +### 列子查询 + +列子查询是指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回。 + +一个列子查询的例子如下: + +``` +SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1) +``` + +### 行子查询 + +行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。 + +一个行子查询的例子如下: + +``` +SELECT * FROM table1 WHERE (1,2) = (SELECT column1, column2 FROM table2) +``` + +### 表子查询(from子查询) + +表子查询是指子查询返回是M行N列的结果集,查询语句可嵌套在FROM关 +键字后,且需要定义别名。 + +## exists子查询 + +exists型[子查询](https://so.csdn.net/so/search?q=子查询&spm=1001.2101.3001.7020)后面是一个受限的select查询语句 +exists子查询,如果exists后的内层查询能查出数据,则返回 TRUE 表示存在;为空则返回 FLASE则不存在。 + + + + + +## 排序函数 + +**排序函数 OVER( [分组子句] 排序子句[DESC][ASC] )** + +**排序子句 :ORDER BY 排序列,排序列…* + +- ROW_NUMBER()函数生成的排序根据排序子句给出**递增连续的序号** +- RANK()函数生成的排序根据排序子句给出**递增的序号,但是存在并列并且跳空** +- DENSE_RANK() 函数生成的排序根据排序子句给出**递增的序号,但是存在并列不跳空** + +根据上面三个函数,我们可以增加一个序列,但是有时候我们需要对数据进行分组,然后对分组后的数据进行增加序列,PARTITION BY可以与以上三个函数联合使用 + + + +### 分页查询 + +##### 方法一、直接限制返回区间 + +```sql +SELECT * FROM table WHERE 查询条件 ORDER BY 排序条件 LIMIT ((页码-1)*页大小),页大小; +``` + +优点:写法简单。 +缺点:当页码和页大小过大时,性能明显下降。 +适用:数据量不大。 + +2、基于LIMIT(MySql)、ROWNUM(Oracle)和TOP(SqlServer),他们可以限制返回的行数,因此可以得到以下两套通用的方法(以SqlServer为例): + +##### 方法二、NOT IN + +```sql +SELECT TOP 页大小 * FROM table WHERE 主键 NOT IN +( + SELECT TOP (页码-1)*页大小 主键 FROM table WHERE 查询条件 ORDER BY 排序条件 +) +ORDER BY 排序条件 +``` + +优点:通用性强。 +缺点:当数据量较大时向后翻页,NOT IN中的数据过大会影响性能。 +适用:数据量不大。 + +##### 方法三、MAX + +```sql +SELECT TOP 页大小 * FROM table WHERE 查询条件 AND id > +( + SELECT ISNULL(MAX(id),0) FROM + ( + SELECT TOP ((页码-1)*页大小) id FROM table WHERE 查询条件 ORDER BY id + ) AS tempTable +) +ORDER BY id +``` + +优点:速度快,特别是当id为主键时。 +缺点:适用面窄,要求排序条件单一且可比较。 +适用:简单排序(特殊情况也可尝试转换成类似可比较值处理)。 + +3、基于SqlServer和Oracle的ROW_NUMBER(),可以得到返回数据的行号,基于此在限制返回区间得到如下方法(以SqlServer为例): + +##### 方法四、ROW_NUMBER() + +```sql +SELECT TOP 页大小 * FROM +( + SELECT TOP (页码*页大小) ROW_NUMBER() OVER (ORDER BY 排序条件) AS RowNum, * FROM table WHERE 查询条件 +) AS tempTable +WHERE RowNum BETWEEN (页码-1)*页大小+1 AND 页码*页大小 +ORDER BY RowNum +``` + +优点:在数据量较大时相比NOT IN有优势。 +缺点:小数据量时不如NOT IN。 +适用:大部分分页查询需求。 + + + -- Gitee