From 18f49f3d80a1a5a8a0b9ef17ed5bd0c8aa5c5d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B7=AB=E6=99=A8=E7=BE=BF?= <1004864698@qq.com> Date: Wed, 28 Sep 2022 10:13:10 +0800 Subject: [PATCH] =?UTF-8?q?47=E5=B7=AB=E6=99=A8=E7=BE=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../9.21.\345\207\275\346\225\260.md" | 38 ++++++ .../9.22.\346\255\273\351\224\201.md" | 31 +++++ ...\277\207\347\250\213(Stored Procedure).md" | 112 ++++++++++++++++ ...7.\350\247\246\345\217\221\345\231\250.md" | 58 +++++++++ ...36\346\216\245\346\237\245\350\257\242.md" | 46 +++++++ ...06\345\233\276\344\275\234\344\270\232.md" | 16 +++ ...70\346\240\207\347\273\203\344\271\240.md" | 32 +++++ ...75\346\225\260\347\273\203\344\271\240.md" | 122 ++++++++++++++++++ ...45\255\220\346\237\245\350\257\242 --1.md" | 76 +++++++++++ 9 files changed, 531 insertions(+) create mode 100644 "47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.21.\345\207\275\346\225\260.md" create mode 100644 "47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.22.\346\255\273\351\224\201.md" create mode 100644 "47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.26.\345\255\230\345\202\250\350\277\207\347\250\213(Stored Procedure).md" create mode 100644 "47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.27.\350\247\246\345\217\221\345\231\250.md" create mode 100644 "47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.1.\350\277\236\346\216\245\346\237\245\350\257\242.md" create mode 100644 "47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.15.\350\247\206\345\233\276\344\275\234\344\270\232.md" create mode 100644 "47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.20.\346\270\270\346\240\207\347\273\203\344\271\240.md" create mode 100644 "47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.21.\345\207\275\346\225\260\347\273\203\344\271\240.md" create mode 100644 "47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.7.--\345\255\220\346\237\245\350\257\242 --1.md" diff --git "a/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.21.\345\207\275\346\225\260.md" "b/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.21.\345\207\275\346\225\260.md" new file mode 100644 index 0000000..15038ed --- /dev/null +++ "b/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.21.\345\207\275\346\225\260.md" @@ -0,0 +1,38 @@ +# 函数 + +(1)系统函数:, + +(2)自定义函数(方法:将一个功能封装成可重用的函数)。 + +1. (1)标量值函数(返回单个值) +2. (2)表值函数(返回查询结果) + +#### 标量值函数 + +```sql +create function 名称(@参数名 数据类型) +returns date_type --返回返回值的数据类型 +as +begin + 函数体 + return 表达式; +end +``` + +#### 表值函数 + +```sql +create function 名称 +returns @局部变量 table(参数名 参数类型) +as + begin + 函数体 + return 函数返回值 + end +``` + +#### 删除自定义函数 + +```sql +drop function 函数名 +``` \ No newline at end of file diff --git "a/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.22.\346\255\273\351\224\201.md" "b/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.22.\346\255\273\351\224\201.md" new file mode 100644 index 0000000..76be46e --- /dev/null +++ "b/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.22.\346\255\273\351\224\201.md" @@ -0,0 +1,31 @@ +# 死锁 + +死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。 + +死锁的产生: + +- 请求与保持:已经获得资源的同时再次申请新资源 +- 非剥夺:已经分配的资源不能被剥夺 +- 循环等待:进程的等待形成环路,都等待相邻进程占据的资源 +- 互斥:某一时刻,资源只能被一个进程占有 + +```sql +--A用户 +--begin transaction: A-->语句1 +--语句1 update StuInfo set classid = 2 where StuName='黄炜杰' +--语句2 update StuInfo set classid = 2 where StuName='李雅芸' +--commit transaction + + +--B用户 +--begin transaction: B-->语句1 +--语句1: update StuInfo set classid = 2 where StuName='李雅芸' +--语句2: update StuInfo set classid = 2 where StuName='黄炜杰' +--commit transaction +/*死锁产生的原因:A事务和B事务需要使用资源1,2,但是A事务占用了资源1,B事务占用了资源2,两个事务同时等待对方资源释放。 +死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态。 + +--防止死锁产生: +--语句保持一致 +--事务语句不要写太长 +``` \ No newline at end of file diff --git "a/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.26.\345\255\230\345\202\250\350\277\207\347\250\213(Stored Procedure).md" "b/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.26.\345\255\230\345\202\250\350\277\207\347\250\213(Stored Procedure).md" new file mode 100644 index 0000000..c18c911 --- /dev/null +++ "b/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.26.\345\255\230\345\202\250\350\277\207\347\250\213(Stored Procedure).md" @@ -0,0 +1,112 @@ +# 存储过程(Stored Procedure) + +### 常用的系统存储过程 + +```sql +sp_databases 列出服务上的所有数据库 +sp_helpdb --报告有关指定数据库或所有数据库的信息 +sp_renamedb 更改数据库的名称 +sp_tables --返回当前环境下可查询的对象的列表 +sp_columns 返回某个表列的信息 +sp_help --返回某个表的所有信息 +sp_helpconstraint 查看某个表的约束 +sp_helpindex --查看某个表的索引 +sp_stored_procedures 列出当前环境中的所有存储过程 +sp_password --添加或修改登录账户的密码 +sp_rename 重命名存储过程 +sp_helptext 显示默认值,未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本。 +``` + +### 创建存储过程 + +### 1.无参 + +```sql +go +create proc 存储过程名 +as +sql语句 +go +``` + +#### 2.有参 + +```sql +go +create proc 存储过程名 +变量1 数据类型, +变量2 数据类型, +... +as +sql语句 +go +``` + +#### 3.有参,但是没有输出参数,有返回值(只能是整数) + +```sql +go +create proc 存储过程名 +变量1 数据类型, +变量2 数据类型, +... +as +sql语句 +return 整数 +go +``` + +#### 4.有参,有输出参数,变量具备同时输入输出参数 + +```sql +go +create proc 存储过程名 +变量1 数据类型 output, +变量2 数据类型 output, +... +as +sql语句 +return 整数 +go +``` + +### 执行存储过程 + +```sql +--无参 +exec <存储过程名称> +--带参 +exec <存储过程名称> <形参1>,<形参2>,... +--带参带返回值 +declare @变量 +exec @变量 = <存储过程名称> <形参1>,<形参2>,... +--有输入参数,有输出参数的存储过程 +declare @变量 +exec <存储过程名称> <形参1>,<形参2>,@变量 output +--一个变量同时具备输入输出功能 +declare @变量 <数据类型> = 值 +exec <存储过程名称> <形参1>,<形参2>,@变量 output +``` + +删除 + +```sql +drop procedure 存储过程名 +``` + +### 存储过程的优点 + +1. 允许模块化程序设计 +2. 执行速度更快 +3. 减少网络流通量 +4. 提高系统安全性 + +### 存储过程与函数的区别 + +#### 1.储存过程可以有返回值也可以无返回值。函数必须有返回值。 + +#### 2.存储过程的实现比较复杂,而函数的实现比较有针对性。 + +#### 3.储存过程可以输入输出参数,而函数只可以输入参数。 + +#### 4.过程允许在其中选择以及DML语句,而函数只可以在其中select语句。 \ No newline at end of file diff --git "a/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.27.\350\247\246\345\217\221\345\231\250.md" "b/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.27.\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..b70f772 --- /dev/null +++ "b/47\345\267\253\346\231\250\347\276\277/sql\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\347\254\224\350\256\260/9.27.\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,58 @@ +# 触发器 + +##### 概念: + +触发器(trigger)是作为对数据库修改的连带效果而由系统自动执行**的一条语句。它是一种特殊的存储过程。也是一个事务(可以回滚) + +##### 条件: + +指明什么时候执行触发器。这被拆分为引起触发器被检测的一个事件和触发器继续执行所必须满足的一个条件。 + +指明当触发器执行时所采取的动作。 + +##### 分类: + +###### 1、after触发器(之后触发) + +a、insert触发器(插入) + +b、update触发器(更新) + +c、delete触发器(删除) + +###### 2、instead of触发器(之前触发) + +描述:after触发器要求只有执行某一操作(insert、update、delete)之后触发器才能被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身,其优先级高于触发语句的执行。 + +#### 语法 + +判断触发器是否存在 + +if (object_id('tr_insert','tr') **is** **not** **null**) + + **drop** **trigger** tr_insert + +创建触发器: + +##### create trigger 触发器名称 + +**on** 表名 **after** **insert**/**delete** + +as + +begin + +​ 触发内容 + +end + +删除触发器: + +##### drop trigger 触发器名称 + +##### + +##### DDL触发器 + +DDL触发器是当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时被激活使用,使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作 + diff --git "a/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.1.\350\277\236\346\216\245\346\237\245\350\257\242.md" "b/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.1.\350\277\236\346\216\245\346\237\245\350\257\242.md" new file mode 100644 index 0000000..d5fd1c9 --- /dev/null +++ "b/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.1.\350\277\236\346\216\245\346\237\245\350\257\242.md" @@ -0,0 +1,46 @@ +--1. 查询出武汉地区所有的员工信息,要求显示部门名称以及员工的详细资料 + +```sql +select * from People p +inner join Department d on p.DepartmentId=d.DepartmentId +where PeopleAddress='武汉' +``` + +--2. 查询出武汉地区所有的员工信息,要求显示部门名称,职级名称以及员工的详细资料 + +```sql +select * from People p +inner join Department d on p.DepartmentId=d.DepartmentId +inner join [Rank] r on p.RankId=r.RankId +where PeopleAddress='武汉' +``` + +--3. 根据部门分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资。 + +```sql +select DepartmentName,count(*) 员工总人数,sum(PeopleSalary) 员工总工资,avg(PeopleSalary) 平均工资,max(PeopleSalary) 最高工资,min(PeopleSalary) 最低工资 +from People p +inner join Department d on p.DepartmentId=d.DepartmentId +group by DepartmentName +``` + +--4. 根据部门分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资,平均工资在10000 以下的不参与统计,并且根据平均工资降序排列。 + +```sql +select DepartmentName,count(*) 员工总人数,sum(PeopleSalary) 员工总工资,avg(PeopleSalary) 平均工资,max(PeopleSalary) 最高工资,min(PeopleSalary) 最低工资 +from People p +inner join Department d on p.DepartmentId=d.DepartmentId +group by DepartmentName +having avg(PeopleSalary)>10000 +order by avg(PeopleSalary) desc +``` + +--5. 根据部门名称,然后根据职位名称,分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资 + +```sql +select DepartmentName,RankName,count(*) 员工总人数,sum(PeopleSalary) 员工总工资,convert(decimal(12,2),avg(PeopleSalary)) 平均工资,max(PeopleSalary) 最高工资,min(PeopleSalary) 最低工资 +from People p +inner join Department d on p.DepartmentId=d.DepartmentId +inner join [Rank] r on p.RankId=r.RankId +group by DepartmentName,RankName +``` \ No newline at end of file diff --git "a/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.15.\350\247\206\345\233\276\344\275\234\344\270\232.md" "b/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.15.\350\247\206\345\233\276\344\275\234\344\270\232.md" new file mode 100644 index 0000000..c95652f --- /dev/null +++ "b/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.15.\350\247\206\345\233\276\344\275\234\344\270\232.md" @@ -0,0 +1,16 @@ +视图作业 + +1编写视图实现查询出所有银行卡账户信息,显示卡号,身份证,姓名,余额。 + +```sql +select * from BankCard + +create view V_non (卡号,身份证,姓名,余额) +as +(select CardNo,AccountCode,RealName,CardMoney +from BankCard b +inner join AccountInfo a on b.AccountId=a.AccountCode) + +select 卡号,身份证,姓名,余额 from V_non +select * from V_non +``` \ No newline at end of file diff --git "a/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.20.\346\270\270\346\240\207\347\273\203\344\271\240.md" "b/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.20.\346\270\270\346\240\207\347\273\203\344\271\240.md" new file mode 100644 index 0000000..a70e3a8 --- /dev/null +++ "b/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.20.\346\270\270\346\240\207\347\273\203\344\271\240.md" @@ -0,0 +1,32 @@ +# 游标练习 + +```sql +-- 创建学生游标,该游标包含(学生姓名,兴趣爱好,生源地,荣誉总数) +declare student cursor scroll for +(select name,hobby,ori_loca,prize from tb_student stu +inner join tb_inf_student istu on stu.stu_num=istu.stu_num ) +-- 循环遍历161开头的学生信息 +declare stu cursor scroll for +(select * from tb_student where stu_num like '161%') +open stu +declare @num varchar(10),@name varchar(10),@sex varchar(2),@birth date, @school varchar(20),@major varchar(20) +fetch first from stu into @num,@name,@sex,@birth,@school,@major +while @@FETCH_STATUS=0 + begin + print @num+','+@name+','+@sex+','+convert(varchar(20),@birth)+','+@school+','+@major + fetch next from stu into @num,@name,@sex,@birth,@school,@major + end +close stu + +-- 使用游标统计生源地为北京的荣誉总数 +declare prize cursor scroll for +(select sum(prize) 荣誉总数 from tb_inf_student where ori_loca='北京') +open prize +declare @prize int +fetch first from prize into @prize +begin + print '北京的荣誉总数'+convert(varchar(20),@prize) +end +close prize +deallocate prize +``` \ No newline at end of file diff --git "a/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.21.\345\207\275\346\225\260\347\273\203\344\271\240.md" "b/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.21.\345\207\275\346\225\260\347\273\203\344\271\240.md" new file mode 100644 index 0000000..65f638f --- /dev/null +++ "b/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.21.\345\207\275\346\225\260\347\273\203\344\271\240.md" @@ -0,0 +1,122 @@ +# 函数练习 + +```sql +--( 1)编写一个函数求该银行的金额总和 +go +create function [money]() +returns money +as +begin + return (select sum(CardMoney) from BankCard) +end +go +select dbo.money() +--(2)传入账户编号,返回账户真实姓名 +go +create function accid(@id int) +returns varchar(10) +as +begin + return (select RealName from AccountInfo where AccountId=@id) +end +go +select dbo.accid(1) +--(3)传递开始时间和结束时间(某个时间段),返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 +go +create function Exchange(@stare date,@end date) +returns @ExchangeInfo table(name varchar(20),carno varchar(20),inmoney money,outmoney money,exchangetime date) +as +begin + insert @ExchangeInfo + select RealName,bc.CardNo,MoneyInBank,MoneyOutBank,ExchangeTime from AccountInfo ac + inner join BankCard bc on ac.AccountId=bc.AccountId + inner join CardExchange ex on bc.CardNo=ex.CardNo + where ExchangeTime between @stare and @end + return +end +go + +select * from Exchange('2022.09.20','2022.09.22') +--方案一(逻辑复杂,函数内容除了返回结果的sql语句还有其他内容,例如定义变量等): + +--(4)查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”, +--根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户", +--分别显示卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +--方案一:直接在sql语句中使用case when +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额, +case + when CardMoney>300000 then 'VIP用户' + else '普通用户' +end 用户等级, +case + when CardState = 1 then '正常' + when CardState = 2 then '挂失' + when CardState = 3 then '冻结' + when CardState = 4 then '注销' +end 银行卡状态 +from BankCard b +inner join AccountInfo a on a.AccountId=b.AccountId +--方案二:将等级和状态用函数实现 + +--等级函数 +go +create function great(@myMoney int) +returns varchar(10) +as +begin + declare @result varchar(10)--声明用户等级 + if @myMoney < 300000 + set @result = '普通用户' + else + set @result = 'VIP用户' + return @result --返回用户等级 +end +go +--状态函数 +go +create function [status](@myNum int) +returns varchar(10) +as +begin + declare @result varchar(10) --声明状态 + if @myNum = 1 + set @result = '正常' + else if @myNum = 2 + set @result = '挂失' + else if @myNum = 3 + set @result = '冻结' + else if @myNum = 4 + set @result = '注销' + else + set @result = '异常' + return @result --返回状态 +end +go + +--查找 +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额, +dbo.great(CardMoney) 账户等级,dbo.[status](CardState) 银行卡状态 +from BankCard inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId +--(5)编写函数,根据出生日期求年龄,年龄求实岁,例如: + +-- 生日为2000-5-5,当前为2018-5-4,年龄为17岁 +-- 生日为2000-5-5,当前为2018-5-6,年龄为18岁 +go +create function f_birthdayToAge --定义函数f_birthdayToAge +(@BirthDate datetime,@ThisDate datetime) --@BirthDate 第一个参数 datetime @ThisDate第二个参数 datetime +returns int --返回值类型 +as +begin + declare @nYear int --定义年龄 + select @nYear = datediff(yy, @BirthDate, @ThisDate) --计算当前日期和出生日期的年份差值 + select @nYear = case + when datediff(dd, dateadd(yy, @nYear, @BirthDate), @ThisDate) < 0 then @nYear - 1 + else @nYear + end --当前日期加上年份差值再和当前日期比较,如果小于当前日期,就把年份减去1,否则就取年份差值 + return @nYear -- 返回年龄 +end +go +select dbo.f_birthdayToAge('2000-5-5','2018-5-4') +select dbo.f_birthdayToAge('2000-5-5','2018-5-6') +``` \ No newline at end of file diff --git "a/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.7.--\345\255\220\346\237\245\350\257\242 --1.md" "b/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.7.--\345\255\220\346\237\245\350\257\242 --1.md" new file mode 100644 index 0000000..44635b9 --- /dev/null +++ "b/47\345\267\253\346\231\250\347\276\277/\344\275\234\344\270\232/9.7.--\345\255\220\346\237\245\350\257\242 --1.md" @@ -0,0 +1,76 @@ +--子查询 --1. 关羽的银行卡号为"6225547858741263",查询出余额比关羽多的银行卡信息,显示卡号,身份证,姓名,余额。 + +```sql +select CardNo,AccountCode,RealName,CardMoney +from BankCard b +inner join AccountInfo a on a.AccountId=b.AccountId +where CardMoney > (select CardMoney + from BankCard + where CardNo=6225547858741263) +``` + +--2.从所有账户信息中查询出余额最高的交易明细(存钱取钱信息)。 + +```sql +select * +from CardExchange c +inner join BankCard b on c.CardNo=b.CardNo +where CardMoney = (select max(CardMoney) + from BankCard) +``` + +--3. 查询有取款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 + +```sql +select CardNo,AccountCode,RealName,CardMoney +from AccountInfo a +inner join BankCard b on a.AccountId=b.AccountId +where CardNo in (select CardNo + from CardExchange + where MoneyOutBank >0) +``` + +--4. 查询出没有存款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 + +```sql +select CardNo,AccountCode,RealName,CardMoney +from AccountInfo a +inner join BankCard b on a.AccountId=b.AccountId +where CardNo not in (select CardNo + from CardExchange + where MoneyInBank >0) +``` + +--5. 关羽的银行卡号为"6225547858741263",查询当天是否有收到转账。 + +```sql +if exists +(select * from CardTransfer +where CardNoIn = '6225547858741263' and CONVERT(VARCHAR(22),GETDATE()) = CONVERT(VARCHAR(22), TransferTime)) + begin + print '有收到转账' + end +else + begin + print '没有收到转账' + end +``` + +--6. 查询出交易次数(存款取款操作)最多的银行卡账户信息,显示:卡号,身份证,姓名,余额,交易数。 + +```sql +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额,(select top 1 count(*) from CardExchange group by CardNo) 交易数 +from BankCard b +inner join AccountInfo a on b.AccountId=a.AccountId +``` + +--7. 查询出没有转账交易记录的银行卡账户信息,显示卡号,身份证,姓名,余额。 + +```sql +select CardNo 卡号, AccountCode 身份证, RealName 姓名, CardMoney 余额 +from BankCard b +inner join AccountInfo a on b.AccountId=a.AccountId +where CardNo not in (select CardNoOut + from CardTransfer) and CardNo not in (select CardNoIn + from CardTransfer) +``` \ No newline at end of file -- Gitee