diff --git "a/36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/9.20\346\270\270\346\240\207\344\275\234\344\270\232.md" "b/36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/9.20\346\270\270\346\240\207\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..88d6465535d5d27067f1a5b552c5ceaa35ec3a65 --- /dev/null +++ "b/36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/9.20\346\270\270\346\240\207\344\275\234\344\270\232.md" @@ -0,0 +1,57 @@ +---创建学生游标,该游标包含(学生姓名,兴趣爱好,生源地,荣誉总数) + +```sql +declare cur cursor scroll for select name,hobby,ori_loca,prize from tb_student tt,tb_inf_student it where tt.stu_num=it.stu_num +open cur +declare @name varchar(20),@hobby varchar(10),@loca varchar(10),@prize int +fetch first from cur into @name,@hobby,@loca,@prize +print @name+','+@hobby+','+@loca+','+cast(@prize as varchar(10)) +``` + + + +---循环遍历161开头的学生信息 + +```sql +declare cur cursor scroll for select it.stu_num,name,hobby,ori_loca,prize from tb_student tt,tb_inf_student it where tt.stu_num=it.stu_num and it.stu_num like '161%' +open cur +declare @num int,@name varchar(20),@hobby varchar(10),@loca varchar(10),@prize int +fetch first from cur into @num,@name,@hobby,@loca,@prize +while @@FETCH_STATUS=0 +begin + print cast(@num as varchar(10))+','+@name+','+@hobby+','+@loca+','+cast(@prize as varchar(10)) +fetch next from cur into @num,@name,@hobby,@loca,@prize +end +``` + +---使用游标统计生源地为北京的荣誉总数 + +```sql + +declare cur cursor scroll for select SUM(prize) 荣誉总数 from tb_inf_student where ori_loca='北京' group by ori_loca +open cur +declare @prize int +fetch first from cur into @prize +print '荣誉总数:'+cast(@prize as varchar(10)) +---合理使用游标和事务,让5-1号前借书的学生将图书归还 +begin transaction +declare cur cursor scroll for select td.rid from tb_student tt,tb_bibliography ty,tb_book tk,tb_record td +where tt.stu_num=td.stu_num and td.barcode = tk.barcode and tk.ISBN=ty.ISBN and return_time is null and MONTH(td.borrow_time)<1 +open cur +declare @rid varchar(20) +declare @err int = 0 +fetch from cur into @rid +set @err += @@ERROR +update tb_record set return_time=GETDATE() where rid=@rid +if @err>0 + begin + print '归还失败' + rollback transaction + end +else + begin + print '归还成功' + commit transaction + end +select * from tb_record +``` \ No newline at end of file diff --git "a/36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/9.21\345\207\275\346\225\260\344\275\234\344\270\232.md" "b/36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/9.21\345\207\275\346\225\260\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..5e4742d8fd87557c001dec40312fb73c867c2529 --- /dev/null +++ "b/36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/9.21\345\207\275\346\225\260\344\275\234\344\270\232.md" @@ -0,0 +1,47 @@ +--(1)编写一个函数求该银行的金额总和 + +```sql +go +create function moneysum() +returns table +as + return select sum(CardMoney) 金额总和 from BankCard +go + +select * from moneysum() +``` + +--(2)传入账户编号,返回账户真实姓名 + +```sql +go +create function zname(@id int) +returns varchar(20) +as +begin + declare @name varchar(20) + select @name=RealName from AccountInfo where AccountId=@id +return @name +end +go +select dbo.zname(2) +``` + +--(3)传递开始时间和结束时间,返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 + +```sql +go +create function cards(@begindate varchar(20),@enddate varchar(20)) +returns table +as + +return select RealName,b.CardNo,MoneyInBank,MoneyOutBank,ExchangeTime from CardExchange c +join BankCard b on c.CardNo=b.CardNo +join AccountInfo a on b.AccountId=a.AccountId +where ExchangeTime > '2022-09-01 00:00:00' and ExchangeTime < '2022-09-30 23:59:59' +go + +select * from cards('2022-09-01','2022-09-30') + +drop function cards +``` \ No newline at end of file diff --git "a/36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213\344\275\234\344\270\232.md" "b/36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..c3b0352a34bb69df529f6d59d19cb90e0e23aea6 --- /dev/null +++ "b/36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/9.26\345\255\230\345\202\250\350\277\207\347\250\213\344\275\234\344\270\232.md" @@ -0,0 +1,77 @@ +--1. 定义存储过程实现查询出账户余额最低的银行卡账户信息,显示银行卡号,姓名,账户余额 + +```sql +go +create proc proc_MinMoney +as +begin + select top 1 s1.CardNo'银行卡号',s2.RealName'姓名',s1.CardMoney'账户余额' from BankCard as s1 + join AccountInfo as s2 on s1.AccountId=s2.AccountId + order by s1.CardMoney +end +go +exec Proc_MinMoney +drop procedure proc_MinMoney +``` + +--2. 模拟银行卡存钱操作,传入银行卡号,存钱金额,实现存钱操作 + +```sql +go +create proc proc_SaveMoney +@CardNumber VARCHAR(30),@SaveMoney money +as +begin + update BankCard set CardMoney =(select CardMoney from BankCard + where CardNo=@CardNumber)+@SaveMoney where CardNo=@CardNumber +end +go +declare @SaveMoney money =1000 +exec proc_SaveMoney '6225547854125656',@SaveMoney +``` + +--3. 模拟银行卡取钱操作,传入银行卡号,取钱金额,实现取钱操作,取钱成功,返回1,取钱失败返回-1 + +```sql +go +create proc proc_OutMoneys +@CardNumber varchar(30),@OutMoney money,@Count varchar(10) output +as +begin + declare @BankMoney money + select @BankMoney=CardMoney from BankCard where CardNo=@CardNumber + if @OutMoney<@BankMoney + begin + update BankCard set CardMoney=@BankMoney-@OutMoney where CardNo=@CardNumber + set @Count =0 + end + else + begin + set @Count=-1 + end +end +go +declare @Count varchar(10) +exec proc_OutMoneys'6225547854125656',1500,@Count output +print @Count +``` + +--4. **查询出某时间段的银行存取款信息以及存款总金额**,取款总金额,传入开始时间,结束时间,显示存取款交易信息的同时,返回存款总金额,取款总金额。 + +```sql +go +create proc proc_SumMoney +@InMoney money output,@OutMoney money output,@EndTime datetime output +as +begin + select @InMoney=sum(MoneyInBank),@OutMoney=sum(MoneyOutBank) from CardExchange where ExchangeTime=@EndTime + set @EndTime =GETDATE() +end +go +declare @InMoney money +declare @OutMoney money +declare @EndTime datetime='2022-09-21 22:13:00' +exec proc_SumMoney @InMoney output,@OutMoney output,@EndTime +print '存款总金额'+cast(@InMoney as varchar(20))+'取款总金额'+cast(@OutMoney as varchar(20))+'结束时间'+cast(@EndTime as varchar(20)) +``` + diff --git "a/36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/\345\217\230\351\207\217\344\270\216\351\200\273\350\276\221\346\216\247\345\210\266.md" "b/36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/9.6\345\217\230\351\207\217\344\270\216\351\200\273\350\276\221\346\216\247\345\210\266.md" similarity index 100% rename from "36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/\345\217\230\351\207\217\344\270\216\351\200\273\350\276\221\346\216\247\345\210\266.md" rename to "36\345\215\261\346\214\257\345\261\261/\344\275\234\344\270\232/9.6\345\217\230\351\207\217\344\270\216\351\200\273\350\276\221\346\216\247\345\210\266.md" diff --git "a/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.21\345\207\275\346\225\260.md" "b/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.21\345\207\275\346\225\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..938c269ca149eabf788d96481671cb5c75f5a23c --- /dev/null +++ "b/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.21\345\207\275\346\225\260.md" @@ -0,0 +1,56 @@ +#### 1、函数 + +函数分为 +(1)系统函数:, +(2)自定义函数(方法:将一个功能封装成可重用的函数)。 + +其中自定义函数又可以分为 +(1)标量值函数(返回单个值), +(2)表值函数(返回查询结果) + +#### 2、标量值函数 + +语法结构: + +CREATE FUNCTION function_name(@parameter_name parameter_data_type) -- +(@参数名 参数的数据类型) + +RETURNS date_type --返回返回值的数据类型 + +[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密 + +[AS] + +BEGIN + + function_body --函数体 + + RETURN 表达式; + +END + +#### 3、表值函数 + +语法结构: + +create function 名称 + +([{@参数名称 参数类型[=默认值]}[,n]]) + +returns @局部变量 table(参数名 参数类型) + +[with encryption] + +[as] + +begin + +函数体 + +return 函数返回值 + +end + +#### 4、删除自定义函数 + +DROP function 函数名 \ No newline at end of file diff --git "a/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.22\346\255\273\351\224\201.md" "b/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.22\346\255\273\351\224\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..9fdbc51bbce374f2f266db4dc8f180c92e7902ae --- /dev/null +++ "b/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.22\346\255\273\351\224\201.md" @@ -0,0 +1,29 @@ +死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。 + +死锁的产生: + +- 请求与保持:已经获得资源的同时再次申请新资源 +- 非剥夺:已经分配的资源不能被剥夺 +- 循环等待:进程的等待形成环路,都等待相邻进程占据的资源 +- 互斥:某一时刻,资源只能被一个进程占有 + +```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/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..a877de7bf56a1ec6e89ad19c6353d1a3d6dda5e9 --- /dev/null +++ "b/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.26\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,128 @@ +##### 自定义存储过程 + +**创建存储过程** + +1.没有输入参数,没有输出参数的存储过程。 + +```sql +create proc <存储过程名称> +as + +go +``` + +2.有输入参数,没有输出参数的存储过程 + +```sql +create proc <存储过程名称> +<变量1> <数据类型> +<变量2> <数据类型> +... +as + +go +``` + +3.有输入参数,没有输出参数,但是有返回值的存储过程(返回值必须整数)。 + +```sql +create proc <存储过程名称> +<变量1> <数据类型> +<变量2> <数据类型> +... +as + +return 整数 +go +``` + +4.有输入参数,有输出参数的存储过程 & 一个变量具备同时输入输出参数的存储过程 + +```sql +create proc <存储过程名称> +<变量1> <数据类型> output +<变量2> <数据类型> output +... +as + +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.变量声明 + +   declare @variable int 或者 @variable int + +   多个变量的声明 declare @variable int, @va vachar(10),....     + +   区别:declare的含义是定义一个存储过程中使用的变量,而不加declare的是存储过程需要传入的参数,下面一个具体的实例可以看得更清楚: + +```sql +--创建存储过程 +create procedure sl_procedure +@va int --参数声明 +as +declare @variable int --变量声明 +set @variable=22 --变量赋值 +select * from Albums +where ArtistId=@va + +--执行存储过程 +exec sl_procedure 12 --12 为传入的参数 +``` + +#### 2.变量赋值:   + +```sql +set @variable=22 --变量赋值 +``` + +   变量赋值时变量前必须加set + +  3.条件控制语句: + +```sql +if(条件) + begin + --执行语句块 + end +else + begin + --执行语句块 + end +``` + +#### 3.循环控制语句 + +```sql +while(条件) + begin + --执行语句块 + end +``` \ No newline at end of file diff --git "a/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.27\350\247\246\345\217\221\345\231\250.md" "b/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.27\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..9cc02e9afc5c4106298143048f8231bc96e0559f --- /dev/null +++ "b/36\345\215\261\346\214\257\345\261\261/\347\254\224\350\256\260/9.27\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,51 @@ +#### **DML触发器分为:** + + 1、 after触发器(之后触发) + +​ a、 [insert](https://so.csdn.net/so/search?q=insert&spm=1001.2101.3001.7020)触发器 + +​ b、 update触发器 + +​ c、 delete触发器 + +#### **2、 instead of 触发器 (之前触发)** + + 其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。 + +#### **3、语法** + +```sql +create trigger tgr_name +on table_name +with encrypion –加密触发器 + for update...—指定触发器的类型 +as + Transact-SQL +go +``` + +#### 4、instead of类型触发器 + + instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身的内容。 + + **语法** + +```sql +create trigger tgr_name +on table_name +with encryption + instead of update... +as + T-SQL + + +``` + +1.插入操作(Insert) +***\*inserted 表\****有数据,***\*deleted 表\****无数据 + +2.删除操作(Delete) +***\*inserted 表\****无数据,***\*deleted 表\****有数据 + +3.更新操作(Update) +***\*inserted 表\****有数据(新数据),***\*deleted 表\****有数据(旧数据) \ No newline at end of file