diff --git "a/46\350\265\226\346\235\260\346\236\227/\344\275\234\344\270\232/2022-09-15--\350\247\206\345\233\276\344\275\234\344\270\232.md" "b/46\350\265\226\346\235\260\346\236\227/\344\275\234\344\270\232/2022-09-15--\350\247\206\345\233\276\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..c9306fefb219103ba47660bec95874e0c9969a20 --- /dev/null +++ "b/46\350\265\226\346\235\260\346\236\227/\344\275\234\344\270\232/2022-09-15--\350\247\206\345\233\276\344\275\234\344\270\232.md" @@ -0,0 +1,179 @@ +``` +drop database banktest +create database BankTest; +go +use banktest; +go +--账户信息表:存储个人信息 +create table AccountInfo +( + AccountId int primary key identity(1,1), --账户编号 + AccountCode varchar(20) not null, --身份证号码 + AccountPhone varchar(20) not null, --电话号码 + RealName varchar(20) not null, --真实姓名 + OpenTime smalldatetime not null, --开户时间 +) +--银行卡表:存储银行卡信息 +create table BankCard +( + CardNo varchar(30) primary key, --银行卡卡号 + AccountId int not null, --账户编号(与账户信息表形成主外键关系) + CardPwd varchar(30) not null, --银行卡密码 + CardMoney money not null, --银行卡余额 + CardState int not null,--1:正常,2:挂失,3:冻结,4:注销 + CardTime smalldatetime default(getdate()) --开卡时间 +) +--交易信息表(存储存钱和取钱的记录) +create table CardExchange +( + ExchangeId int primary key identity(1,1), --交易自动编号 + CardNo varchar(30) not null, --银行卡号(与银行卡表形成主外键关系) + MoneyInBank money not null, --存钱金额 + MoneyOutBank money not null, --取钱金额 + ExchangeTime smalldatetime not null, --交易时间 +) +--转账信息表(存储转账信息记录) +create table CardTransfer +( + TransferId int primary key identity(1,1),--转账自动编号 + CardNoOut varchar(30) not null, --转出银行卡号(与银行卡表形成主外键关系) + CardNoIn varchar(30) not null, --转入银行卡号(与银行卡表形成主外键关系) + TransferMoney money not null,--交易金额 + TransferTime smalldatetime not null, --交易时间 +) +--状态信息变化表(存储银行卡状态变化的记录,状态有1:正常,2:挂失,3:冻结,4:注销) +create table CardStateChange +( + StateId int primary key identity(1,1),--状态信息自动编号 + CardNo varchar(30) not null, --银行卡号(与银行卡表形成主外键关系) + OldState int not null, --银行卡原始状态 + NewState int not null, --银行卡新状态 + StateWhy varchar(200) not null, --状态变化原因 + StateTime smalldatetime not null, --记录产生时间 +) + + + +--为刘备,关羽,张飞三个人进行开户开卡的操作 +--刘备身份证:420107198905064135 +--关羽身份证:420107199507104133 +--张飞身份证:420107199602034138 +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107198905064135','13554785425','刘备',GETDATE()) +insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) +values('6225125478544587',1,'123456',0,1) + +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107199507104133','13454788854','关羽',GETDATE()) +insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) +values('6225547858741263',2,'123456',0,1) + +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107199602034138','13456896321','张飞',GETDATE()) +insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) +values('6225547854125656',3,'123456',0,1) + +select * from AccountInfo +select * from BankCard + + + +--进行存钱操作,刘备存钱2000元,关羽存钱:8000元,张飞存钱:500000元 +select * from AccountInfo + +update BankCard set CardMoney = CardMoney + 2000 where CardNo = '6225125478544587' +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('6225125478544587',2000,0,GETDATE()) + +update BankCard set CardMoney = CardMoney + 8000 where CardNo = '6225547858741263' +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('6225547858741263',8000,0,GETDATE()) + +update BankCard set CardMoney = CardMoney + 500000 where CardNo = '6225547854125656' +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('6225547854125656',500000,0,GETDATE()) + +--转账:刘备给张飞转账1000元 +update BankCard set CardMoney = CardMoney -1000 where CardNo = '6225125478544587' +update BankCard set CardMoney = CardMoney + 1000 where CardNo = '6225547854125656' + +insert into CardTransfer(CardNoOut,CardNoIn,TransferMoney,TransferTime) +values('6225125478544587','6225547854125656',1000,GETDATE()) + + + +select * from AccountInfo --个人信息 +select * from BankCard --银行卡信息 +select * from CardStateChange --银行卡状态更改表 +select * from CardTransfer --转账表 +select * from CardExchange --交易记录 + +--1. 为赵云此人进行开户开卡操作,赵云身份证:420107199904054233 +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107199904054233','13554785565','赵云',GETDATE()) +insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) +values('622554875466518777',1,'123456',0,1) + +--2. 需要求出张飞的银行卡卡号和余额,张飞身份证:420107199602034138 (1.使用连接查询,2.使用变量) BankCard 连接 AccountInfo +declare @zf varchar(50)='420107199602034138' +select @zf =(select CardNo +from BankCard +inner join AccountInfo a on a.AccountId=BankCard.AccountId where AccountCode=@zf) +print @zf + +declare @zfv varchar(50)='420107199602034138' +select @zfv =(select CardMoney +from BankCard +inner join AccountInfo a on a.AccountId=BankCard.AccountId where AccountCode=@zfv) +print @zfv + +-- 逻辑控制 +-- 条件分支if-else + +-- 3.某用户银行卡号为“6225547854125656”,该用户执行取钱操作,取钱5000元,余额充足则进行取钱操作,并提示"取钱成功",否则提示“余额不足”。 + +select * from AccountInfo +select * from BankCard + +declare @qu varchar='6225547854125656' +declare @m money +select @m= CardMoney from BankCard where CardNo=@qu +if @m-5000>=0 +begin + print '取钱成功' +end +else +begin + print '余额不足' +end + +--update BankCard set CardMoney = CardMoney - 5000 where CardNo = @qu + --insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) + --values(@qu,-5000,0,GETDATE()) + +-- 条件分支:case-when + +-- 4.查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”,并且根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户", +----显示列分别为卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +select * from BankCard + +select * +case +when cardstate =1 than '正常' +when cardState =2 than '挂失' +when cardState =3 than '冻结' +when cardState =4 than '注销' +end +case +FROM BankCard + +--1)编写视图实现查询出所有银行卡账户信息,显示卡号,身份证,姓名,余额。 +create view V_Bankinfo(卡号,身份证,姓名,余额) +as +(select CardNo,AccountCode,RealName,CardMoney from +BankCard d join AccountInfo a on d.AccountId = a.AccountId) +with check option + +select * from V_Bankinfo +``` \ No newline at end of file diff --git "a/46\350\265\226\346\235\260\346\236\227/\344\275\234\344\270\232/2022-09-19--\344\272\213\345\212\241\344\275\234\344\270\232.md" "b/46\350\265\226\346\235\260\346\236\227/\344\275\234\344\270\232/2022-09-19--\344\272\213\345\212\241\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..0aa2a48d11b73e61251d803663ba2e09a76e9653 --- /dev/null +++ "b/46\350\265\226\346\235\260\346\236\227/\344\275\234\344\270\232/2022-09-19--\344\272\213\345\212\241\344\275\234\344\270\232.md" @@ -0,0 +1,37 @@ +```sql +--(1)刘备账户扣除1000元 (2)张飞账户添加1000元 (3)生成转账记录 + +alter table BankCard add constraint CK_cardmoney check(CardMoney>=0) + +select * from AccountInfo +select * from BankCard +select * from CardExchange +select * from CardTransfer + + +begin transaction + declare @myerr int = 0 + declare @CardNo1 varchar(200),@CardNo2 varchar(200),@money money = 1000 + select @CardNo1= CardNo from BankCard where AccountId = (select AccountId from AccountInfo where RealName='刘备') + select @CardNo2= CardNo from BankCard where AccountId = (select AccountId from AccountInfo where RealName='张飞') + update BankCard set CardMoney = CardMoney-@money where AccountId = (select AccountId from AccountInfo where RealName='刘备') + set @myerr = @myerr + @@ERROR + update BankCard set CardMoney = CardMoney+@money where AccountId = (select AccountId from AccountInfo where RealName='张飞') + set @myerr = @myerr + @@ERROR + --银行卡交易记录 + insert CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) values(@CardNo1,0,1000,GETDATE()) + insert CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) values(@CardNo2,1000,0,GETDATE()) + --转账记录 + insert CardTransfer(CardNoOut,CardNoIn,TransferMoney,TransferTime) values(@CardNo1,@CardNo2,@money,GETDATE()) + +if @myerr = 0 + begin + commit transaction + print '转账成功' + end +else + begin + rollback transaction + print '转账失败' + end +``` \ No newline at end of file diff --git "a/46\350\265\226\346\235\260\346\236\227/\344\275\234\344\270\232/2022-09-21--\345\207\275\346\225\260\344\275\234\344\270\232.md" "b/46\350\265\226\346\235\260\346\236\227/\344\275\234\344\270\232/2022-09-21--\345\207\275\346\225\260\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..0e5f6fc1025eda55303b842017550ac3414996e6 --- /dev/null +++ "b/46\350\265\226\346\235\260\346\236\227/\344\275\234\344\270\232/2022-09-21--\345\207\275\346\225\260\344\275\234\344\270\232.md" @@ -0,0 +1,151 @@ +```sql +create database BankTest; +go +use banktest; +go +--账户信息表:存储个人信息 +create table AccountInfo +( + AccountId int primary key identity(1,1), --账户编号 + AccountCode varchar(20) not null, --身份证号码 + AccountPhone varchar(20) not null, --电话号码 + RealName varchar(20) not null, --真实姓名 + OpenTime smalldatetime not null, --开户时间 +) +--银行卡表:存储银行卡信息 +create table BankCard +( + CardNo varchar(30) primary key, --银行卡卡号 + AccountId int not null, --账户编号(与账户信息表形成主外键关系) + CardPwd varchar(30) not null, --银行卡密码 + CardMoney money not null, --银行卡余额 + CardState int not null,--1:正常,2:挂失,3:冻结,4:注销 + CardTime smalldatetime default(getdate()) --开卡时间 +) +--交易信息表(存储存钱和取钱的记录) +create table CardExchange +( + ExchangeId int primary key identity(1,1), --交易自动编号 + CardNo varchar(30) not null, --银行卡号(与银行卡表形成主外键关系) + MoneyInBank money not null, --存钱金额 + MoneyOutBank money not null, --取钱金额 + ExchangeTime smalldatetime not null, --交易时间 +) +--转账信息表(存储转账信息记录) +create table CardTransfer +( + TransferId int primary key identity(1,1),--转账自动编号 + CardNoOut varchar(30) not null, --转出银行卡号(与银行卡表形成主外键关系) + CardNoIn varchar(30) not null, --转入银行卡号(与银行卡表形成主外键关系) + TransferMoney money not null,--交易金额 + TransferTime smalldatetime not null, --交易时间 +) +--状态信息变化表(存储银行卡状态变化的记录,状态有1:正常,2:挂失,3:冻结,4:注销) +create table CardStateChange +( + StateId int primary key identity(1,1),--状态信息自动编号 + CardNo varchar(30) not null, --银行卡号(与银行卡表形成主外键关系) + OldState int not null, --银行卡原始状态 + NewState int not null, --银行卡新状态 + StateWhy varchar(200) not null, --状态变化原因 + StateTime smalldatetime not null, --记录产生时间 +) + + + +--为刘备,关羽,张飞三个人进行开户开卡的操作 +--刘备身份证:420107198905064135 +--关羽身份证:420107199507104133 +--张飞身份证:420107199602034138 +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107198905064135','13554785425','刘备',GETDATE()) +insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) +values('6225125478544587',1,'123456',0,1) + +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107199507104133','13454788854','关羽',GETDATE()) +insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) +values('6225547858741263',2,'123456',0,1) + +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107199602034138','13456896321','张飞',GETDATE()) +insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) +values('6225547854125656',3,'123456',0,1) + +select * from AccountInfo +select * from BankCard + + + +--进行存钱操作,刘备存钱2000元,关羽存钱:8000元,张飞存钱:500000元 +select * from AccountInfo +update BankCard set CardMoney = CardMoney + 2000 where CardNo = '6225125478544587' +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('6225125478544587',2000,0,GETDATE()) + +update BankCard set CardMoney = CardMoney + 8000 where CardNo = '6225547858741263' + +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('6225547858741263',8000,0,GETDATE()) + +update BankCard set CardMoney = CardMoney + 500000 where CardNo = '6225547854125656' +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('6225547854125656',500000,0,GETDATE()) + +--转账:刘备给张飞转账1000元 +update BankCard set CardMoney = CardMoney -1000 where CardNo = '6225125478544587' +update BankCard set CardMoney = CardMoney + 1000 where CardNo = '6225547854125656' + +insert into CardTransfer(CardNoOut,CardNoIn,TransferMoney,TransferTime) +values('6225125478544587','6225547854125656',1000,GETDATE()) + + + +select * from AccountInfo --个人信息 +select * from BankCard --银行卡信息 +select * from CardStateChange --银行卡状态更改表 +select * from CardTransfer --转账表 +select * from CardExchange --交易记录 + +--(1)编写一个函数求该银行的金额总和 +go +create function banktotal() +returns decimal +as +begin + declare @sum decimal = (select sum(cardmoney) from BankCard) + return @sum +end +go +select dbo.banktotal() 金额总和 + + +--(2)传入账户编号,返回账户真实姓名 +go +create function Bankid(@id int) +returns varchar(5) +as +begin + declare @name varchar(5) = (select RealName from BankCard b join AccountInfo a on b.AccountId = a.AccountId where b.AccountId = @id) + return @name +end +go + +select dbo.Bankid(3)账户姓名 + +--(3)传递开始时间和结束时间,返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 +DROP function Exchange +go +create function Exchange(@start smalldatetime,@end smalldatetime) +returns @tableinfo table(Realname varchar(10),cardno varchar(20),MoneyInBank decimal,MoneyOutBank decimal,ExchangeTime date) +as +begin + insert into @tableinfo + select RealName,c.CardNo,MoneyInBank,MoneyOutBank,ExchangeTime from BankCard b join AccountInfo a on b.AccountId = a.AccountId join CardExchange c on b.CardNo = c.CardNo + where ExchangeTime between @start and @end + return +end +go + +select * from dbo.Exchange('2022-07-1','2022-09-30') +``` \ No newline at end of file diff --git "a/46\350\265\226\346\235\260\346\236\227/\347\254\224\350\256\260/2022-09-22--\346\255\273\351\224\201.md" "b/46\350\265\226\346\235\260\346\236\227/\347\254\224\350\256\260/2022-09-22--\346\255\273\351\224\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..0acff5fad580af33490b463c78195c74840c080b --- /dev/null +++ "b/46\350\265\226\346\235\260\346\236\227/\347\254\224\350\256\260/2022-09-22--\346\255\273\351\224\201.md" @@ -0,0 +1,34 @@ +# 死锁 + +### 概念 + +```sql +就是两个或多个trans,同时请求对方正在请求的某个实际应用对象,而导致双方互相等待。 +``` + +### 几种表现 + +```sql +--表现1. + +一个用户A 访问表A(锁住了表A),然后又访问表B。 +另一个用户B 访问表B(锁住了表B),然后企图访问表A, +这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了,同样用户B要等用户A释放表A才能继续,这就造成死锁了。 + +--解决方法: +这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法 +仔细分析你程序的逻辑, +1:尽量避免同时锁定两个资源 +2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源. +--表现2. + +用户A读一条纪录,然后修改该条纪录。 +这时用户B修改该条纪录,这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释 +放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。 +这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。 + +--解决方法 +让用户A的事务(即先读后写类型的操作),在select 时用Update lock +语法如下: +select * from table1 with(updlock) where .... +``` \ No newline at end of file diff --git "a/46\350\265\226\346\235\260\346\236\227/\347\254\224\350\256\260/2022-09-24--\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/46\350\265\226\346\235\260\346\236\227/\347\254\224\350\256\260/2022-09-24--\345\255\230\345\202\250\350\277\207\347\250\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..f0470701f3edd4c7955292748f3dd604dc7d6e4a --- /dev/null +++ "b/46\350\265\226\346\235\260\346\236\227/\347\254\224\350\256\260/2022-09-24--\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,121 @@ +# 存储过程(Stored Procedure) + +### 什么是存储过程 + +存储过程是**预编译**SQL语句集合,这些语句存储在一个名称(存储过程的名称)下并作为单元来处理。存储过程代替了传统的逐条执行SQL语句的方式,一个存储过程中可以包含查询、插入、删除、更新等操纵的一系列SQL语句,当这个存储过程被调用执行时,这些操作也会同时执行。 + +封装好 --> 调用 + +### 存储过程的分类 + +#### 系统存储过程 + + 系统存储过程是用来管理SQL Server与显示有关数据库和用户的信息的存储过程。 + +常见的系统存储过程有 + +```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 +create proc <存储过程名称(proc_名称)> +as + +go +``` + +2.有输入参数,没有输出参数的存储过程 + +```sql +create proc <存储过程名称(proc_名称)> +<变量1> <数据类型> +<变量2> <数据类型> +... +as + +go +``` + + + +3.有输入参数,没有输出参数,但是有返回值的存储过程(返回值必须整数)。 + +```sql +create proc <存储过程名称> +<变量1> <数据类型> +<变量2> <数据类型> +... +as + +return 整数(int型) +go +``` + + + +4.有输入参数,有输出参数的存储过程 & 一个变量具备同时输入输出参数的存储过程 + +```sql +create proc <存储过程名称> +<变量1> <数据类型> output +<变量2> <数据类型> output +... +as + +return 整数 +go +``` + + + +**执行存储过程** + +```sql +--无参 +exec <存储过程名称> + +--带参 +exec <存储过程名称> <形参1>,<形参2>,... + +--带参带返回值 +declare @变量 +exec @变量 = <存储过程名称> <形参1>,<形参2>,... +print @变量 (如果类型不一致 强转cast(@变量 as 类型)) + +--有输入参数,有输出参数的存储过程 +declare @变量 +exec <存储过程名称> <形参1>,<形参2>,@变量 output + +--一个变量同时具备输入输出功能 +declare @变量 <数据类型> = 值 +exec <存储过程名称> <形参1>,<形参2>,@变量 output +``` + + + +**删除存储过程** + +```sql +drop procedure <存储过程名称> +``` +