From 90b74dd89af6559eb8c3c0b3784c3cbcc01c0994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=B0=8F=E6=9D=B0?= <2365584215@qq.com> Date: Wed, 28 Sep 2022 21:31:57 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\275\234\344\270\232/2022.9.20.md" | 65 ++++++++ .../\344\275\234\344\270\232/2022.9.21.md" | 42 +++++ .../\344\275\234\344\270\232/2022.9.26.md" | 48 ++++++ .../\344\275\234\344\270\232/2022.9.27.md" | 42 +++++ .../2022.9.22--\346\255\273\351\224\201.md" | 45 ++++++ ...30\345\202\250\350\277\207\347\250\213.md" | 147 ++++++++++++++++++ ...--\350\247\246\345\217\221\345\231\250.md" | 55 +++++++ 7 files changed, 444 insertions(+) create mode 100644 "39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.20.md" create mode 100644 "39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.21.md" create mode 100644 "39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.26.md" create mode 100644 "39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.27.md" create mode 100644 "39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.22--\346\255\273\351\224\201.md" create mode 100644 "39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.26--\345\255\230\345\202\250\350\277\207\347\250\213.md" create mode 100644 "39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" diff --git "a/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.20.md" "b/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.20.md" new file mode 100644 index 0000000..ed60d5e --- /dev/null +++ "b/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.20.md" @@ -0,0 +1,65 @@ +``` +--- 创建学生游标,该游标包含(学生姓名,兴趣爱好,生源地,荣誉总数) +declare student cursor scroll for(select name,hobby,ori_loca,prize from tb_student ts inner join tb_inf_student ti on ts.stu_num=ti.stu_num) +declare @names varchar(10),@hobbys varchar(10),@loca varchar(10),@prizes int + +open student +fetch first from student into @names,@hobbys,@loca,@prizes +while(@@FETCH_STATUS=0) +begin + fetch next from student into @names,@hobbys,@loca,@prizes + print @names+','+@hobbys+','+@loca+','+convert(varchar(20),@prizes) +end + +close student + +--- 循环遍历161开头的学生信息 +declare stu_information cursor scroll for(select * from tb_student where stu_num like '161%') +declare @num int,@name varchar(10),@gender int,@birth date,@school varchar(10),@major varchar(20) + +open stu_information +fetch first from stu_information into @num,@name,@gender,@birth,@school,@major +while(@@FETCH_STATUS=0) +begin + fetch next from stu_information into @num,@name,@gender,@birth,@school,@major + print convert(varchar(2),@num)+','+@name+','+convert(varchar(2),@gender)+','+convert(varchar(20),@birth)+','+@school+','+@major +end +close stu_information + +--- 使用游标统计生源地为北京的荣誉总数 +declare loca cursor scroll for(select sum(prize) from tb_inf_student where ori_loca='北京') +declare @locas int +open loca +fetch first from loca into @locas +while(@@FETCH_STATUS=0) +begin + fetch next from loca into @locas + print @locas +end +close loca + +--- 合理使用游标和事务,让5-1号前借书的学生将图书归还 +declare books cursor scroll for(select * from tb_record where borrow_time<'2019-05-01' and return_time is null) +open books +begin transaction + + declare @nums int=0 + update tb_record set return_time=GETDATE() where borrow_time<'2019-05-01'and return_time is null + set @nums += @@ERROR + +print @nums +if @nums>0 + begin + print '未归还' + rollback transaction + end +else + begin + print '已归还' + commit transaction + end + + +close books +select * from tb_record +``` \ No newline at end of file diff --git "a/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.21.md" "b/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.21.md" new file mode 100644 index 0000000..500c20d --- /dev/null +++ "b/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.21.md" @@ -0,0 +1,42 @@ +``` +--(1)编写一个函数求该银行的金额总和 +go +create function sumMONEY(@money money) +returns money +as +begin + select @money1=(select sum(CardMoney) from BankCard) + return @money +end +go + +select dbo.sumMONEY('') 金额 + +--(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') +``` \ No newline at end of file diff --git "a/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.26.md" "b/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.26.md" new file mode 100644 index 0000000..523a76b --- /dev/null +++ "b/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.26.md" @@ -0,0 +1,48 @@ +``` +go +create proc proc_GetMoney +as + select CardNo 卡号,RealName 姓名,min(CardMoney) 账户余额 from AccountInfo a + inner join BankCard b on a.AccountId=b.AccountId group by CardNo,RealName + having min(CardMoney) in (select top 1 CardMoney from BankCard order by CardMoney) +go + +exec proc_GetMoney + + +--2. 模拟银行卡存钱操作,传入银行卡号,存钱金额,实现存钱操作 +go +create proc proc_Money +@card varchar(20), +@savemoney varchar(20) +as + update BankCard set CardMoney=CardMoney+@savemoney where CardNo=@card + insert into CardExchange values(@card,@savemoney,'0',GETDATE()) + +go + +exec proc_Money '6225568781547896','400' + + +--3. 模拟银行卡取钱操作,传入银行卡号,取钱金额,实现取钱操作,取钱成功,返回1,取钱失败返回-1 +go +create proc proc_GetDraw +@cardid varchar(20), +@draw money +as + if exists(select CardMoney from BankCard where CardNo=@cardid and CardMoney>=@draw) + begin + update BankCard set CardMoney=CardMoney-@draw where CardNo=@cardid + insert into CardExchange values(@cardid,'0',@draw,GETDATE()) + print '1' + end + else + begin + print '-1' + end +go + +exec proc_GetDraw '6225547854125656','500000' + + +``` \ No newline at end of file diff --git "a/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.27.md" "b/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.27.md" new file mode 100644 index 0000000..c511dc6 --- /dev/null +++ "b/39\345\217\266\345\260\217\346\235\260/\344\275\234\344\270\232/2022.9.27.md" @@ -0,0 +1,42 @@ +```sql + +--(1)假设有部门表和员工表,在添加员工的时候,该员工的部门编号如果在部门表中找不到,则自动添加部门信息,部门名称为"新部门"。 +go +create trigger tri_st +on people after insert +as +begin +declare @stuno varchar (10)= (select DepartmentId from inserted) +if @stuno not in (select DepartmentId from Department) +begin +insert into Department values (@stuno,'新部门') +end +end +go +insert into people values ('007','哈哈哈哈哈','男',1) + +--(2)触发器实现,删除一个部门的时候将部门下所有员工全部删除 +go +create trigger tri_table +on Department after delete +as +begin +delete from People where departmentid =(select DepartmentId from deleted) +end +go +delete from Department where DepartmentId = '007' + +--(3)创建一个触发器,删除一个部门的时候判断该部门下是否有员工,有则不删除,没有则删除 +go +create trigger tri_gg +on department instead of delete +as +begin +if exists(select * from People where DepartmentId =(select DepartmentId from deleted ) ) +print '有员工不能删除' +else +delete from Department where DepartmentId=(select DepartmentId from deleted) +end +go +delete from Department where DepartmentId='002' +``` \ No newline at end of file diff --git "a/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.22--\346\255\273\351\224\201.md" "b/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.22--\346\255\273\351\224\201.md" new file mode 100644 index 0000000..a2a9298 --- /dev/null +++ "b/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.22--\346\255\273\351\224\201.md" @@ -0,0 +1,45 @@ +### 一,死锁 + +#### 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) + diff --git "a/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.26--\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.26--\345\255\230\345\202\250\350\277\207\347\250\213.md" new file mode 100644 index 0000000..e6ff901 --- /dev/null +++ "b/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.26--\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,147 @@ +## 存储过程 + +#### 什么是存储过程 + +存储过程是**预编译**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 <存储过程名称> +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.储存过程可以有返回值也可以无返回值。函数必须有返回值。 + +2.存储过程的实现比较复杂,而函数的实现比较有针对性。 + +3.储存过程可以输入输出参数,而函数只可以输入参数。 + +4.过程允许在其中选择以及DML语句,而函数只可以在其中select语句。 + +5.可以在存储过程中调用函数,不可以在函数中调用存储过程。 + +6.函数可以作为条件在语句中使用,但是存储过程不可以。 \ No newline at end of file diff --git "a/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" "b/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..97c9234 --- /dev/null +++ "b/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,55 @@ +## 触发器(trigger) + + **触发器**( trigger )是作为**对数据库修改的连带效果**而**由系统自动执行**的一条语句。它是一种特殊的**存储过程**。也是一个**事务**(可以回滚)。为了定义一个[触发器](https://so.csdn.net/so/search?q=触发器&spm=1001.2101.3001.7020),我们必须: + +- 指明**什么时候执行触发器**。这被拆分为**引起触发器被检测的一个\*事件\***和**触发器继续执行所必须满足的一个条件**。 +- 指明**当触发器执行时所采取的动作**。 + +## 触发器分类 + +#### after触发器: + +after触发器主要用于:insert,update,delete + +#### instead of 触发器 + +- instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。 + + ### 创建触发器的语句 + +```sql + create TRIGGER <触发器名称> + +ON table_name + +[WITH ENCRYPTION] + +FOR [DELETE, INSERT, UPDATE] + +AS + + SQL语句 + +GO +``` + + + +#### 删除触发器 + +```sql +drop trigger trigger_name +``` + + + +##### instead of 触发器 + + 1.插入操作(Insert) +***\*inserted 表\****有数据,***\*deleted 表\****无数据 + +2.删除操作(Delete) +***\*inserted 表\****无数据,***\*deleted 表\****有数据 + +3.更新操作(Update) +***\*inserted 表\****有数据(新数据),***\*deleted 表\****有数据(旧数据) \ No newline at end of file -- Gitee From c4801075af787e5bcd7cdbc711bb09eab7e1a65e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=B0=8F=E6=9D=B0?= <2365584215@qq.com> Date: Wed, 28 Sep 2022 22:05:41 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...--\350\247\246\345\217\221\345\231\250.md" | 17 ++++++++++ .../2022.9.28--union.md" | 32 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 "39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.28--union.md" diff --git "a/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" "b/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" index 97c9234..5a0c674 100644 --- "a/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" +++ "b/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.27--\350\247\246\345\217\221\345\231\250.md" @@ -13,8 +13,25 @@ after触发器主要用于:insert,update,delete #### instead of 触发器 +使用`INSTEAD OF`触发器的典型示例是覆盖视图上的插入,更新或删除操作。 + - instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。 +- 、`INSTEAD OF`触发器是一种触发器,用于跳过对表或视图的[INSERT],[DELETE]或[UPDATE]语句,并执行触发器中定义的其他语句。根本不会发生实际的插入,删除或更新操作。 + + 换句话说,`INSTEAD OF`触发器会跳过`DML`语句并执行其他语句。 + + ``` + CREATE TRIGGER [schema_name.] trigger_name + ON INSTEAD OF {[INSERT] [,] [UPDATE] [,] [DELETE] } + AS + begin + --sql语句 + end + + + ``` + ### 创建触发器的语句 ```sql diff --git "a/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.28--union.md" "b/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.28--union.md" new file mode 100644 index 0000000..77135f2 --- /dev/null +++ "b/39\345\217\266\345\260\217\346\235\260/\347\254\224\350\256\260/2022.9.28--union.md" @@ -0,0 +1,32 @@ + + +### 列转行: union + +UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 + +### 行转列:pivot, Case when + +## case when + +case when 以及 sum(max也可以,依据实际情况) + +```sql +select name, + max(case subject when '语文' then score else 0 end) as 语文, + max(case subject when '数学' then score else 0 end) as 数学, + max(case subject when '英语' then score else 0 end) as 英语 +from T +group by name; +``` + +### PIVOT + +从逻辑上来做处理,但是看起来相对麻烦,系统给了一种更为简洁的方法,PIVOT + +```sql +SELECT * + FROM T + PIVOT ( + SUM(score) FOR subject IN (语文, 数学, 英语) +) +``` \ No newline at end of file -- Gitee