From c44e3e4299e3f9c3f4f7b6a61da8c37b1ff288fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E9=A3=98?= <2422417047@qq.com> Date: Sun, 25 Sep 2022 21:10:06 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=94=E8=AE=B0+=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\260\357\274\210function\357\274\211.md" | 134 ++++++++++++++++++ ...25\260\357\274\210function\357\274\211.md" | 98 +++++++++++++ ...2\350\257\276-\346\255\273\351\224\201.md" | 51 +++++++ 3 files changed, 283 insertions(+) create mode 100644 "40\345\221\250\351\243\230/\344\275\234\344\270\232/2022.09.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276-\345\207\275\346\225\260\357\274\210function\357\274\211.md" create mode 100644 "40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276-\345\207\275\346\225\260\357\274\210function\357\274\211.md" create mode 100644 "40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.22 \347\254\254\345\215\201\344\272\214\350\212\202\350\257\276-\346\255\273\351\224\201.md" diff --git "a/40\345\221\250\351\243\230/\344\275\234\344\270\232/2022.09.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276-\345\207\275\346\225\260\357\274\210function\357\274\211.md" "b/40\345\221\250\351\243\230/\344\275\234\344\270\232/2022.09.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276-\345\207\275\346\225\260\357\274\210function\357\274\211.md" new file mode 100644 index 0000000..eac51fc --- /dev/null +++ "b/40\345\221\250\351\243\230/\344\275\234\344\270\232/2022.09.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276-\345\207\275\346\225\260\357\274\210function\357\274\211.md" @@ -0,0 +1,134 @@ +```sql +use BankTest +go + +select * from AccountInfo +select * from BankCard +select * from CardExchange +select * from CardStateChange +select * from CardTransfer + +--(1)编写一个函数求该银行的金额总和 +go +create function SAVEMONEY(@money money) +returns money +as +begin + select @money=(select sum(CardMoney) from BankCard) + return @money +end +go + +select dbo.SAVEMONEY('') 金额 + +--(2)传入账户编号,返回账户真实姓名 +go +create function AID(@ID int) +returns varchar(20) +as +begin + return (select RealName from AccountInfo where AccountId=@ID) +end +go + +select dbo.AID('2') 姓名 + +--(3)传递开始时间和结束时间,返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 +go +create function INFORMATION(@time date,@times date) +returns @TABLE table(RealName varchar(10),CardNo varchar(20),MoneyInBank money,MoneyOutBank money,ExchangeTime date) +as +begin + insert into @TABLE + select RealName,b.CardNo,MoneyInBank,MoneyOutBank,ExchangeTime from AccountInfo a + inner join BankCard b on a.AccountId=b.AccountId + inner join CardExchange c on b.CardNo=c.CardNo + return +end +go + +select * from dbo.INFORMATION('2022-09-06','2022-09-19') + + +--方案一(逻辑复杂,函数内容除了返回结果的sql语句还有其他内容,例如定义变量等): + +--(4)查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”,根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户", +--分别显示卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +--方案一:直接在sql语句中使用case when +select CardNo,AccountCode,RealName,CardMoney, +case + when CardMoney>=300000 then 'VIP用户' + when CardMoney<300000 then '普通用户' +end '用户等级', +case + when CardState=1 then '正常' + when CardState=2 then '挂失' + when CardState=3 then '冻结' + when CardState=4 then '注销' +end '银行卡状态' +from AccountInfo a inner join BankCard b on a.AccountId=b.AccountId + +--方案二:将等级和状态用函数实现 +go +create function BANK() +returns @TABLES table(CId varchar(20),AId varchar(20),Name varchar(10),CMoney money,GRADE varchar(20),[STATE] varchar(20)) +as +begin + insert into @TABLES + select CardNo,AccountCode,RealName,CardMoney, + case + when CardMoney>=300000 then 'VIP用户' + when CardMoney<300000 then '普通用户' + end '用户等级', + case + when CardState=1 then '正常' + when CardState=2 then '挂失' + when CardState=3 then '冻结' + when CardState=4 then '注销' + end '银行卡状态' + from AccountInfo a inner join BankCard b on a.AccountId=b.AccountId + return +end +go + +select * from dbo.BANK() + + + +create table Emp +( + EmpId int primary key identity(1,2), --自动编号 + empName varchar(20), --姓名 + empSex varchar(4), --性别 + empBirth smalldatetime --生日 +) +insert into Emp(empName,empSex,empBirth) values('刘备','男','2008-5-8') +insert into Emp(empName,empSex,empBirth) values('关羽','男','1998-10-10') +insert into Emp(empName,empSex,empBirth) values('张飞','男','1999-7-5') +insert into Emp(empName,empSex,empBirth) values('赵云','男','2003-12-12') +insert into Emp(empName,empSex,empBirth) values('马超','男','2003-1-5') +insert into Emp(empName,empSex,empBirth) values('黄忠','男','1988-8-4') +insert into Emp(empName,empSex,empBirth) values('魏延','男','1998-5-2') +insert into Emp(empName,empSex,empBirth) values('简雍','男','1992-2-20') +insert into Emp(empName,empSex,empBirth) values('诸葛亮','男','1993-3-1') +insert into Emp(empName,empSex,empBirth) values('徐庶','男','1994-8-5') + +select * from Emp +--(5)编写函数,根据出生日期求年龄,年龄求实岁,例如: +--生日为2000-5-5,当前为2018-5-4,年龄为17岁 +--生日为2000-5-5,当前为2018-5-6,年龄为18岁 +go +create function AGE() +returns @TABLEtime table(birthday date,gittime date,age int) +as +begin + insert into @TABLEtime + select empBirth,getdate(),year(getdate())-year(empBirth) from Emp + return +end +go + +select * from dbo.AGE() +``` + diff --git "a/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276-\345\207\275\346\225\260\357\274\210function\357\274\211.md" "b/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276-\345\207\275\346\225\260\357\274\210function\357\274\211.md" new file mode 100644 index 0000000..6ccfc79 --- /dev/null +++ "b/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276-\345\207\275\346\225\260\357\274\210function\357\274\211.md" @@ -0,0 +1,98 @@ +### 一、函数 + +#### 1,优点 + +* 进行模块化程序设计 +* 加快执行速度 +* 减少网络流量 + +#### 2,分类 + +##### (1)标量值函数(Scalar Function) + +* 返回一个在returns字句中定义的确定类型的标量值, + +##### (2)内嵌表值函数(Inline Function) + +* 返回的数据类型是由选择结果构成记录集的table函数 + +##### (3)多语句表值函数(Multi-Statement Function) + +* 标量函数和内联表值函数相联系而成的结合体,返回值也是一张表 + +##### (4)内嵌表值函数和多语句表值函数都返回表,**二者不同之处在于:** + +1. 内嵌表值函数没有函数主体,返回的表是单个SELECT语句的结果集 +2. 多语句表值函数返回值是一个表,但它和标量函数一样有一个用BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的 + + + +#### 3、适用范围 + +- 只查询,不修改数据库的状态(修改、删除表中记录等) + +- 结果集需要通过递归等方法得到时,可以使用函数,函数比较灵活 + +- 结果集需要直接被引用时,可以使用函数。需要对结果集进行再加工(指放在select语句中等),可以使用函数,函数可以嵌在select等sql语句中。 + + + +#### 4、标量值函数(返回指定值) + +```sql +go +create function function_name(@参数名 数据类型) +returns + 返回值的数据类型 +as +begin + 操作 + return --返回一个指定的值 +end +go +--查看函数 +select dbo.函数名(值) +``` + + + +#### 5、内嵌表值函数(返回一个表) + +```sql +create function 函数名 (标量参数 标量参数类型) +returns table +as +begin + return (select查询语句) +end + +select * from dbo.函数名('') +``` + + + +#### 6、多语句表值函数 + +* 返回值的表中的数据是由函数体中的语句插入的 + +```SQL +go +create function 函数名 (标量参数 参数类型) +returns @表名 table(表列名1 数据类型1,表列名2 数据类型2,表列名3 数据类型3...) +as +begin + insert into @表名 values(用户自定义为表中添加数据) from 表名 where... + return +end +go + +--查看函数 +select * from dbo.函数名() +``` + + + +#### 7,删除函数(drop) + +```sql +drop function 函数名 +``` \ No newline at end of file diff --git "a/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.22 \347\254\254\345\215\201\344\272\214\350\212\202\350\257\276-\346\255\273\351\224\201.md" "b/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.22 \347\254\254\345\215\201\344\272\214\350\212\202\350\257\276-\346\255\273\351\224\201.md" new file mode 100644 index 0000000..dabb56f --- /dev/null +++ "b/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.22 \347\254\254\345\215\201\344\272\214\350\212\202\350\257\276-\346\255\273\351\224\201.md" @@ -0,0 +1,51 @@ +### 一,死锁 + +#### 1,概念 + +* 指第一个事务正在进行数据更新操作,第二个事务选择读取了尚未被确认的数据或者读取的是第一个事务正在更新的数据行,由此产生未被确认的相关性问题 + +#### 2,分类 + +##### (1)从数据库视角分析 + +* 独占锁/排他锁(exclusive lock);主要用于数据的修改 +* 共享锁(shared lock);主要用于数据的读取 +* 更新锁(update lock);主要用于数据的更新 + +##### (2)从程序员视角分析 + +* 乐观锁(optimistic lock);进行数据处理时不需要用户额外进行任何工作 +* 悲观锁(pessimistic lock);系统不对任何锁操作负责,对数据或资源对象的加锁操作均由用户直接管理(包括获取,共享和释放任何在数据上使用的锁) + + + +#### 3、产生条件 + +##### (1)请求与保持;已经获取资源的同时可以再次申请新资源 + +##### (2)非剥夺;已经分配的资源不能被剥夺,只能在使用完后自己释放 + +##### (3)循环等待;进程的等待形成环路,都等待相邻进程占据的资源 + +##### (4)互斥;某一时刻,资源只能被一个进程所占有 + + + +#### 4,处理死锁的基本方法 + +##### 1.预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件 + +##### 2.避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁 + +##### 3.检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉 + +##### 4.解除死锁:该方法与检测死锁配合使用 + + + +#### 5,查询 + +##### 1,查询所有进程锁(exec sp_lock) + +##### 2,查询指定进程n的锁( exec sp_lock n) + -- Gitee