From e069971e1caafeed836fa65846a4b3c0f234a410 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E6=B1=9F=E5=98=89=E5=85=B4=E2=80=9D?= <“1994738974@qq.com”> Date: Sun, 25 Sep 2022 19:24:26 +0800 Subject: [PATCH] 0 --- ...75\346\225\260\344\275\234\344\270\232.md" | 80 +++++++++++++++++ ...70\346\240\207\344\275\234\344\270\232.md" | 39 ++++++++ ...06\345\233\276\344\275\234\344\270\232.md" | 17 ++++ .../9.19\344\272\213\345\212\241.md" | 84 +++++++++++++++++ .../9.20\346\270\270\346\240\207.md" | 75 ++++++++++++++++ .../9.21\345\207\275\346\225\260.md" | 89 +++++++++++++++++++ ...22\346\255\273\351\224\201\357\274\237.md" | 23 +++++ 7 files changed, 407 insertions(+) create mode 100644 "44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\345\207\275\346\225\260\344\275\234\344\270\232.md" create mode 100644 "44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\346\270\270\346\240\207\344\275\234\344\270\232.md" create mode 100644 "44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\350\247\206\345\233\276\344\275\234\344\270\232.md" create mode 100644 "44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.19\344\272\213\345\212\241.md" create mode 100644 "44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.20\346\270\270\346\240\207.md" create mode 100644 "44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.21\345\207\275\346\225\260.md" create mode 100644 "44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.22\346\255\273\351\224\201\357\274\237.md" diff --git "a/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\345\207\275\346\225\260\344\275\234\344\270\232.md" "b/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\345\207\275\346\225\260\344\275\234\344\270\232.md" new file mode 100644 index 0000000..9a022aa --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\345\207\275\346\225\260\344\275\234\344\270\232.md" @@ -0,0 +1,80 @@ +函数作业 + +```sql +--(1)编写一个函数求该银行的金额总和 +go +create function sun() +returns int +as +begin + declare @sum money + select @sum = sum(CardMoney) from BankCard + + return @sum +end +go + select dbo.sun() + +--(2)传入账户编号,返回账户真实姓名 +go +create function hu(@AccId int) +returns varchar(20) +as +begin + declare @name varchar(20) + select @name =RealName from AccountInfo where AccountId =@AccId + return @name +end +go + select dbo.hu(1) 姓名 + (3)传递开始时间和结束时间,返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 +--select * from CardExchange --交易记录 + +go +create function Tranc(@f smalldatetime ,@e smalldatetime) +returns @table table(ReName varchar(20),CardNo varchar(30),MoneyInBank money,MoneyOutBank money,ExchangeTime time) +as +begin + insert into @table + select RealName,c.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 between @f and @e + return +end +go +select * from Tranc('2022-09-20','2022-09-22') +--方案一(逻辑复杂,函数内容除了返回结果的sql语句还有其他内容,例如定义变量等): + +--(4)查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”,根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户",分别显示卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +--方案一:直接在sql语句中使用case when +select +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 join AccountInfo a on b.AccountId=a.AccountId + + +--方案二:将等级和状态用函数实现 + +--(5)编写函数,根据出生日期求年龄,年龄求实岁,例如: +go +create function data(@star smalldatetime,@end smalldatetime) +returns varchar(20) +as +begin +return(select year(@end)-year(@star) from table_name) +end +go +select dbo.data('2018-5-4','2000-5-5') +-- 生日为2000-5-5,当前为2018-5-4,年龄为17岁 +-- 生日为2000-5-5,当前为2018-5-6,年龄为18岁 +``` + diff --git "a/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\346\270\270\346\240\207\344\275\234\344\270\232.md" "b/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\346\270\270\346\240\207\344\275\234\344\270\232.md" new file mode 100644 index 0000000..cdc8476 --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\346\270\270\346\240\207\344\275\234\344\270\232.md" @@ -0,0 +1,39 @@ +游标作业 + +```sql + +--- 创建学生游标,该游标包含(学生姓名,兴趣爱好,生源地,荣誉总数) +declare mycur cursor scroll for select name,speciality,ori_loca,prize + from tb_student s join tb_inf_student t on t.stu_num=s.stu_num +--- 循环遍历161开头的学生信息 + +declare mycurs cursor scroll for select * from tb_student where stu_num like '161%' +open mycurs +declare @num varchar(20) +declare @name varchar(20) +declare @gender int +declare @birth date +declare @school varchar(20) +declare @majoin varchar(20) +fetch first from mycurs into @num,@name,@gender,@birth,@school,@majoin +while @@FETCH_STATUS =0 +begin + print @num+' ,'+@name+' ,'+ convert(varchar,@gender)+' ,'+convert(varchar, @birth)+' ,'+@school+@majoin + fetch next from mycurs into @num,@name,@gender,@birth,@school,@majoin + +end +close mycurs +--- 使用游标统计生源地为北京的荣誉总数 +declare curso cursor scroll for select sum(prize) from tb_inf_student where ori_loca='北京' +open curso +declare @prize int +fetch first from curso into @prize +while @@FETCH_STATUS =0 + begin + print @prize + fetch next from curso into @prize + end + close curso +--- 合理使用游标和事务,让5-1号前借书的学生将图书归还 +``` + diff --git "a/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\350\247\206\345\233\276\344\275\234\344\270\232.md" "b/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\350\247\206\345\233\276\344\275\234\344\270\232.md" new file mode 100644 index 0000000..bbac049 --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\350\247\206\345\233\276\344\275\234\344\270\232.md" @@ -0,0 +1,17 @@ +视图作业 + +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 +``` + diff --git "a/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.19\344\272\213\345\212\241.md" "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.19\344\272\213\345\212\241.md" new file mode 100644 index 0000000..0007d9d --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.19\344\272\213\345\212\241.md" @@ -0,0 +1,84 @@ +# 事务 + +### 事务的流程 + +- + +1. ##### 开始事务: + + ```sql + BEGIN TRANSACTION + ``` + + 事务开始后,直接执行代码,通常在修改表的代码行后会插入全局变量(@ERROR)进行错误代码的判断,一般会定义变量来装错误代码(@ERROR),在执行代码后,会用if进行判断 + + @ERROR是否为0,若为0则提交事务(2),反之回滚(3) + +2. ##### 提交事务: + + ```sql + COMMIT TRANSACTION + ``` + + 当代码块无错误时,直接执行代码块 + +3. ##### 回滚(撤销)事务: + + ```sql + ROLLBACK TRANSACTION + ``` + + 当代码块有错误时,返回以上至begin之间已执行的代码。(相当于撤销) + +4. ##### 存储点语句:SAVE TRANSACTION + +#### 事务的属性(ACID) + +一般来说,事务具有四个标准属性,分别是原子性(**A**tomicity,或称不可分割性)、一致性(**C**onsistency)、隔离性(**I**solation,又称独立性)、持久性(**D**urability),简称 **ACID**。具体说明如下: + +##### 1) 原子性 + +一个事务中的所有 SQL 语句,要么全部执行成功,要么全部执行失败,不会结束在中间的某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 + +##### 2) 一致性 + +在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全符合所有的预设规则,其中包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 + +##### 3) 隔离性 + +数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 死锁 操作系统 + +##### 4) 持久性 + +事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。 + +#### 事务分类 + +1.显式事务 + +2.隐式事务 + +##### 例子 + +```sql +begin transaction +declare @mon money = 6000 +declare @no varchar(20) +declare @err int = 0 --一开始所有语句都没有错误 +select @no = cardno from BankCard where AccountId=(select AccountId from AccountInfo where RealName='刘备') +update BankCard set CardMoney=CardMoney-@mon where AccountId=(select AccountId from AccountInfo where RealName='刘备') +set @err += @@ERROR +insert CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) values(@no,0,@mon,getdate()) + +if @err>0 + begin + print '事务提交失败' + rollback transaction + end +else + begin + print '事务提交成功' + commit transaction + end +``` + diff --git "a/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.20\346\270\270\346\240\207.md" "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.20\346\270\270\346\240\207.md" new file mode 100644 index 0000000..19f8630 --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.20\346\270\270\346\240\207.md" @@ -0,0 +1,75 @@ +### **游标概念** + + SQL的游标是一种临时的数据库对象,既可以存放储存在数据库表中数据行的副本,也指向数据行的指针。 SQL游标作用 1.遍历数据行; 2.保存查询结果,方便下文调用。 概念中提到使用游标会保存数据行的副本,那么创建游标后,下文查询即可从副本中查询,要比直接查数据库快很多。 + +### 游标分类: + +(1)静态游标(Static):在操作游标的时候,数据发生变化,游标中数据不变 +(2)动态游标(Dynamic):在操作游标的时候,数据发生变化,游标中数据改变,默认值。 +(3)键集驱动游标(KeySet):在操作游标的时候,被标识的列发生改变,游标中数据改变,其他列改变,游标中数据不变。 + +### 游标的使用 + +**创建游标:** + +```sql +--1.创建游标(Scroll代表滚动游标,不加Scroll则是只进的,只能支持fetch next) +declare <游标名> cursor scroll for select stuname from stuinfo +``` + +**打开游标:** + +```sql +open <游标名> +``` + +**关闭游标:** + +``` +close <游标名> +``` + +**删除游标:** + +``` +deallocate <游标名> +``` + + + +**提取数据操作:** + +```sql +fetch first from <游标名> --结果集的第一行 +fetch last from <游标名> --最后一行 +fetch absolute 1 from <游标名> --从游标的第一行开始数,第n行。 +fetch relative 3 from <游标名> --从当前位置数,第n行。 +fetch next from <游标名> --当前位置的下一行 +fetch prior from <游标名> --当前位置的上一行 +``` + + + +例子 + +```sql +循环遍历161开头的学生信息 + +declare mycurs cursor scroll for select * from tb_student where stu_num like '161%' +open mycurs +declare @num varchar(20) +declare @name varchar(20) +declare @gender int +declare @birth date +declare @school varchar(20) +declare @majoin varchar(20) +fetch first from mycurs into @num,@name,@gender,@birth,@school,@majoin +while @@FETCH_STATUS =0 +begin + print @num+' ,'+@name+' ,'+ convert(varchar,@gender)+' ,'+convert(varchar, @birth)+' ,'+@school+@majoin + fetch next from mycurs into @num,@name,@gender,@birth,@school,@majoin + +end +close mycurs +``` + diff --git "a/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.21\345\207\275\346\225\260.md" "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.21\345\207\275\346\225\260.md" new file mode 100644 index 0000000..25e12af --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.21\345\207\275\346\225\260.md" @@ -0,0 +1,89 @@ +#### 函数分类 + +**sql server 自定义函数**分为三种类型:标量函数(Scalar Function)、内嵌表值函数(Inline Function)、多声明表值函数(Multi-Statement Function) 标量函数:标量函数是对单一值操作,返回单一值。 + +#### 标量值函数 + +语法结构: + +```sql +CREATE FUNCTION function_name(@parameter_name parameter_data_type) --(@参数名 参数的数据类型) +RETURNS date_type --返回返回值的数据类型 + +[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密 + +[AS] + +BEGIN + + function_body --函数体 + + RETURN 表达式; + +END +``` + +#### 表值函数 + +语法结构: + +```sql +create function 名称 + +([{@参数名称 参数类型[=默认值]}[,n]]) + +returns @局部变量 table(参数名 参数类型) + +[with encryption] + +[as] + +begin + +函数体 + +return 函数返回值 + +end +``` + + + +#### 删除自定义函数 + +```sql +DROP function 函数名 +``` + +#### 例子 + +```sql +标量值函数 +--(1)编写一个函数求该银行的金额总和 +go +create function sun() +returns int +as +begin + declare @sum money + select @sum = sum(CardMoney) from BankCard + + return @sum +end +go + select dbo.sun() + +--(2)传入账户编号,返回账户真实姓名 +go +create function hu(@AccId int) +returns varchar(20) +as +begin + declare @name varchar(20) + select @name =RealName from AccountInfo where AccountId =@AccId + return @name +end +go + select dbo.hu(1) 姓名 +``` + diff --git "a/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.22\346\255\273\351\224\201\357\274\237.md" "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.22\346\255\273\351\224\201\357\274\237.md" new file mode 100644 index 0000000..765da12 --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.22\346\255\273\351\224\201\357\274\237.md" @@ -0,0 +1,23 @@ + + +### 什么是死锁? + +死锁指的是在两个或两个以上不同的进程或线程中,由于存在共同资源的竞争或进程(或线程)间的通讯而导致各个线程间相互挂起等待,如果没有外力作用,最终会引发整个系统崩溃。 + +### Mysql出现死锁的必要条件 + +#### 资源独占条件 + +指多个事务在竞争同一个资源时存在互斥性,即在一段时间内某资源只由一个事务占用,也可叫独占资源(如行锁)。 + +#### 请求和保持条件 + +指在一个事务a中已经获得锁A,但又提出了新的锁B请求,而该锁B已被其它事务b占有,此时该事务a则会阻塞,但又对自己已获得的锁A保持不放。 + +#### 不剥夺条件 + +指一个事务a中已经获得锁A,在未提交之前,不能被剥夺,只能在使用完后提交事务再自己释放。 + +#### 相互获取锁条件 + +指在发生死锁时,必然存在一个相互获取锁过程,即持有锁A的事务a在获取锁B的同时,持有锁B的事务b也在获取锁A,最终导致相互获取而各个事务都阻塞 \ No newline at end of file -- Gitee