diff --git "a/25\346\235\250\344\270\260\345\215\216/\344\275\234\344\270\232/9.21 \347\254\254\345\215\201\344\270\200\350\212\202 \345\207\275\346\225\260/9.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276 \345\207\275\346\225\260.md" "b/25\346\235\250\344\270\260\345\215\216/\344\275\234\344\270\232/9.21 \347\254\254\345\215\201\344\270\200\350\212\202 \345\207\275\346\225\260/9.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276 \345\207\275\346\225\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..fe49bb2cd476bf62d9d2b4030dc80e097ce34f37 --- /dev/null +++ "b/25\346\235\250\344\270\260\345\215\216/\344\275\234\344\270\232/9.21 \347\254\254\345\215\201\344\270\200\350\212\202 \345\207\275\346\225\260/9.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276 \345\207\275\346\225\260.md" @@ -0,0 +1,113 @@ +``` + + +--1)编写一个函数求该银行的金额总和 +go +create function Bankk(@na money) +returns money +as +begin + + return (select sum(CardMoney) from BankCard ) +end +go + +select dbo.Bankk('') 金额总和 + +--(2)传入账户编号,返回账户真实姓名 +go +create function Bankk2(@ID int) +returns varchar(20) +as +begin + + return (select RealName from AccountInfo where AccountId=@ID ) +end +go + +--drop function Bankk2 + +select dbo.Bankk2('1') 真实姓名 + +--(3)传递开始时间和结束时间,返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 +go +create function Bankk3(@ID time) +returns @oo table (realname varchar(20),CardId varchar(20),Inmoney money,Outmoney money,Times time ) +as +begin + insert into @oo + 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 Bankk3('2022-09-21 16:21:00') + +--drop function Bankk3 +--方案一(逻辑复杂,函数内容除了返回结果的sql语句还有其他内容,例如定义变量等): + +--(4)查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”,根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户",分别显示卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +--方案一:直接在sql语句中使用case when + +select CardNo 卡号, RealName 姓名 ,AccountCode 身份证,CardMoney 余额, +case +when CardState='1' then '正常' +when CardState='2' then '挂失' +when CardState='3' then '冻结' +when CardState='4' then '注销' +else '无' +end '银行卡状态', +case +when CardMoney>=300000 then 'VIP用户' +when CardMoney>0 then'普通用户' +end '用户等级' +from AccountInfo a inner join BankCard b on a.AccountId=b.AccountId + +--方案二:将等级和状态用函数实现 +go +create function Bankk4() +returns @ii table(CardNo1 varchar(20), RealName1 varchar(20),AccountCode1 varchar(20),Carmoney money,statu varchar(20),V varchar(20)) +as +begin +insert into @ii +select CardNo, RealName ,AccountCode,CardMoney, + case + when CardState='1' then '正常' + when CardState='2' then '挂失' + when CardState='3' then '冻结' + when CardState='4' then '注销' +else '无' +end '银行卡状态', + case + when CardMoney>=300000 then 'VIP用户' + when CardMoney>0 then'普通用户' +end '用户等级' +from AccountInfo a inner join BankCard b on a.AccountId=b.AccountId + +return +end +go +select * from Bankk4() +--(5)编写函数,根据出生日期求年龄,年龄求实岁,例如: + +--​ 生日为2000-5-5,当前为2018-5-4,年龄为17岁 +--​ 生日为2000-5-5,当前为2018-5-6,年龄为18岁 +go +create function Bankk5() +returns @pp table(birth date ,today date,age int ) +as +begin + insert into @pp + select empBirth,GETDATE() 当前时间,(year(GETDATE())-YEAR(empBirth)) from Emp + + return +end +go +select * from Bankk5() +drop function Bankk5 + +``` + diff --git "a/25\346\235\250\344\270\260\345\215\216/\347\254\224\350\256\260/9.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276 \345\207\275\346\225\260.md" "b/25\346\235\250\344\270\260\345\215\216/\347\254\224\350\256\260/9.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276 \345\207\275\346\225\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..79b8b4ecf8677027b6f641745b5a833f3ffaaed1 --- /dev/null +++ "b/25\346\235\250\344\270\260\345\215\216/\347\254\224\350\256\260/9.21 \347\254\254\345\215\201\344\270\200\350\212\202\350\257\276 \345\207\275\346\225\260.md" @@ -0,0 +1,77 @@ +## 一、函数 + +#### 1、自定义函数 + +分类:sql server 自定义函数分为三种类型:标量函数(Scalar Function)、内嵌表值函数(Inline Function)、多声明表值函数(Multi-Statement Function) + +#### 2、标量函数 + +标量函数是对单一值操作,返回单一值 + +标量函数语法: + +``` +创造标量函数: +go +create function 函数名 (标量参数 参数类型) +returns 标量返回值类型 +as +begin + 内容 + return +end +go + +查看函数: +select dbo.函数名(值) +``` + + + +#### 3、内嵌式函数 + +内嵌表值函数的功能相当于一个参数化的视图。它返回的是一个表,内联表值型函数没有由BEGIN-END 语句括起来的函数体。 + +创建内嵌表值函数语法: + +``` +创造内嵌式函数: +create function 函数名 (标量参数 标量参数类型) +returns table +as +return(单个select 语句) +``` + + + +#### 4、多声明表函数 + +它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。 + +它可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值型函数的不足。 + +多声明表函数: + +``` +创造多声明表函数: +go +create function 函数名 (标量参数 参数类型) +returns @表名 table(列的定义) +as +begin + + return + +end +go +查看: +select * from 函数名 +``` + +#### 5、适用范围 + +- 只查询,不修改数据库的状态(修改、删除表中记录等) + +- 结果集需要通过递归等方法得到时,可以使用函数,函数比较灵活 + +- 结果集需要直接被引用时,可以使用函数。需要对结果集进行再加工(指放在select语句中等),可以使用函数,函数可以嵌在select等sql语句中。 \ No newline at end of file diff --git "a/25\346\235\250\344\270\260\345\215\216/\347\254\224\350\256\260/9.22 \347\254\254\345\215\201\344\272\214\350\212\202\350\257\276-\346\255\273\351\224\201.md" "b/25\346\235\250\344\270\260\345\215\216/\347\254\224\350\256\260/9.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 0000000000000000000000000000000000000000..dabb56fbe478be546db0dc081debff0870faba3c --- /dev/null +++ "b/25\346\235\250\344\270\260\345\215\216/\347\254\224\350\256\260/9.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) +