From 0407459561e63cf3ae75d819f18f4b7d10e770a8 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: Wed, 5 Oct 2022 19:01:15 +0800 Subject: [PATCH] 00 --- ...\345\212\241\344\275\234\344\270\232 -.md" | 27 ++++ ...07\347\250\213\344\275\234\344\270\232.md" | 91 ++++++++++++ ...21\345\231\250\344\275\234\344\270\232.md" | 65 +++++++++ ...50\345\255\230\350\277\207\347\250\213.md" | 120 +++++++++++++++ ...28\350\247\246\345\217\221\345\231\250.md" | 138 ++++++++++++++++++ ...13\345\212\241\351\232\224\347\246\273.md" | 6 + 6 files changed, 447 insertions(+) create mode 100644 "44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\344\272\213\345\212\241\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/\345\202\250\345\255\230\350\277\207\347\250\213\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\246\345\217\221\345\231\250\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.26\345\202\250\345\255\230\350\277\207\347\250\213.md" create mode 100644 "44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.27and9.28\350\247\246\345\217\221\345\231\250.md" create mode 100644 "44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.29\344\272\213\345\212\241\351\232\224\347\246\273.md" diff --git "a/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\344\272\213\345\212\241\344\275\234\344\270\232 -.md" "b/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\344\272\213\345\212\241\344\275\234\344\270\232 -.md" new file mode 100644 index 0000000..8628c83 --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\344\272\213\345\212\241\344\275\234\344\270\232 -.md" @@ -0,0 +1,27 @@ +```sql +-2.--刘备向张飞转账1000元,(添加check约束,设置账户余额必须>=0) + +begin transaction +declare @l varchar(20) =(select AccountId from AccountInfo where RealName='刘备') --刘备id +declare @lc varchar(20) =(select cardno from BankCard where AccountId=@l) --刘备卡号 +declare @z varchar(20) =(select AccountId from AccountInfo where RealName='张飞') --张飞id +declare @zc varchar(20) =(select cardno from BankCard where AccountId=@z)--张飞卡号 +declare @mom money =1000 --转账额度 +declare @err varchar(20) =0 --错误数目 + +update BankCard set CardMoney=CardMoney-@mom where AccountId=@l +update BankCard set CardMoney=CardMoney+@mom where AccountId=@z +set @err+=@@error +insert CardTransfer (CardNoOut,CardNoIn,TransferMoney,TransferTime)values(@lc,@zc,@mom,GETDATE()) +insert CardTransfer (CardNoOut,CardNoIn,TransferMoney,TransferTime)values(@zc,@lc,@mom,GETDATE()) +insert CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime)values(@lc,0,@mom,GETDATE()) +insert CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime)values(@zc,@mom,0,GETDATE()) +--判断 +if @err>0 +begin +print '转账失败' + rollback transaction + end +else +print '转账成功' +``` \ No newline at end of file diff --git "a/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\345\202\250\345\255\230\350\277\207\347\250\213\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\202\250\345\255\230\350\277\207\347\250\213\344\275\234\344\270\232.md" new file mode 100644 index 0000000..4afeb60 --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\345\202\250\345\255\230\350\277\207\347\250\213\344\275\234\344\270\232.md" @@ -0,0 +1,91 @@ +--1. 定义存储过程实现查询出账户余额最低的银行卡账户信息,显示银行卡号,姓名,账户余额 +go +create proc peoc_GetMinMone +as +select a.RealName,b.CardNo,b.CardMoney from AccountInfo a join BankCard b on a.AccountId=b.AccountId +go + +exec peoc_GetMinMone +--2. 模拟银行卡存钱操作,传入银行卡号,存钱金额,实现存钱操作 +go +create proc proc_GetCards +@cardNo varchar(30), +@cMoney money +as + update BankCard set CardMoney+=@cMoney where CardNo=@cardNo + return + go + exec proc_GetCards '6225547858741263','2000' + +--3. 模拟银行卡取钱操作,传入银行卡号,取钱金额,实现取钱操作,取钱成功,返回1,取钱失败返回-1 +---法一 + +go +create proc proc_OutMoneys +@CardNo varchar(30), +@outMoney money +as + if @outMoney<=(select CardMoney from BankCard where CardNo=@CardNo) + begin + update BankCard set CardMoney=CardMoney-@outMoney where CardNo=@CardNo + insert CardExchange values(@CardNo,0,@outMoney,GETDATE()) + return 1 + end + else return -1 +go +declare @aa int +exec @aa=proc_OutMoneys '6225547858741263','1000' +print @aa + + +--法二 +go + create proc proc_OutMoneyss + @CardNo varchar(30) output , + @outMoney money output + as + declare @money money + select @money = CardMoney from BankCard + if(@outMoney - @money>0) + BEGIN + update BankCard set @money -= @outMoney where CardNo=@CardNo + insert CardExchange values(@CardNo,0,@outMoney,GETDATE()) + return 1 + END + else + return -1 + declare @bb int + exec @bb=proc_OutMoneys '6225547858741263','1000' + print @bb + go + select * from BankCard + + -- drop procedure proc_OutMoney +--4. **查询出某时间段的银行存取款信息以及存款总金额**,取款总金额,传入开始时间,结束时间, +--显示存取款交易信息的同时,返回存款总金额,取款总金额。 + +``` +go +create proc p4 +@k datetime, +@j datetime, +@MoneyInBank money output, +@MoneyOutBank money output +as +select * from CardExchange c +where c.ExchangeTime between @k and @j +select @MoneyInBank = sum(c.MoneyInBank) ,@MoneyOutBank = sum(c.MoneyOutBank) from CardExchange c +go +declare @MoneyInBank money +declare @MoneyOutBank money +exec p4 '2022-09-20','2022-09-27',@MoneyInBank output,@MoneyOutBank output +print '存款总金额'+ convert(varchar(20),@MoneyInBank) + '取款总金额'+ convert(varchar(20),@MoneyOutBank) +select c.MoneyOutBank from CardExchange c +select * from BankCard b +``` + + + +--5. **密码升级**,传入用户名和密码,如果用户名密码正确,并且密码长度<8,自动升级成8位密码 + +--(提示:随机生成 0-9 的整数: float(rand()*10)) rand():随机生成0.0-1.0的小数 float:向下取整) \ No newline at end of file diff --git "a/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\350\247\246\345\217\221\345\231\250\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\246\345\217\221\345\231\250\344\275\234\344\270\232.md" new file mode 100644 index 0000000..09391e4 --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\344\275\234\344\270\232/\350\247\246\345\217\221\345\231\250\344\275\234\344\270\232.md" @@ -0,0 +1,65 @@ +```sql +select * from Department +select * from People + + +--(1)假设有部门表和员工表,在添加员工的时候,该员工的部门编号如果在部门表中找不到,则自动添加部门信息,部门名称为"新部门"。 +go +create trigger tri_d1 +on people after insert +as + + if (select DepartmentId from inserted ) not in(select DepartmentId from Department) + begin + declare @Id varchar(20) + set @Id=(select DepartmentId from inserted) + insert Department values(@Id,'新部门') + end + +go + +insert People values ('009','赵云','男','10000') + +--(2)触发器实现,删除一个部门的时候将部门下所有员工全部删除。 +go +create trigger tri_de +on department after delete +as + delete from People where DepartmentId=(select DepartmentId from deleted) +go + +delete from Department where DepartmentName='市场部' + + +--(3)创建一个触发器,删除一个部门的时候判断该部门下是否有员工,有则不删除,没有则删除。 +go +create trigger tri_d3 +on department after delete +as +if exists(select DepartmentId from People where DepartmentId in (select DepartmentId from deleted) ) + begin + rollback transaction + end + +go + +delete from Department where DepartmentName='人事部' +--(4)修改一个部门编号之后,将该部门下所有员工的部门编号同步进行修改 +go +create trigger tri_d4 +on department after update +as + declare @Id varchar(10)= (select DepartmentId from inserted) + declare @Id2 varchar(10)=(select DepartmentId from deleted) + + if update(DepartmentId) + begin + update People set DepartmentId=@Id from inserted + where People.DepartmentId=@Id2 + end + +go + + +update Department set DepartmentId='008' where DepartmentId='001' +``` \ No newline at end of file diff --git "a/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.26\345\202\250\345\255\230\350\277\207\347\250\213.md" "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.26\345\202\250\345\255\230\350\277\207\347\250\213.md" new file mode 100644 index 0000000..74ad3fe --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.26\345\202\250\345\255\230\350\277\207\347\250\213.md" @@ -0,0 +1,120 @@ +### 1.存储过程的概念 + +存储过程:已[预编译](https://so.csdn.net/so/search?q=预编译&spm=1001.2101.3001.7020)为一个可执行过程的一个或多个SQL语句的集合。 + +### 2.存储过程的语法 + +#### 2.1创建存储过程 + +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 +``` + +#### 2.2 重命名存储过程 + +``` +sp_rename 'Proc_Stu','Proc_StuInfo' +``` + +#### 2.3**删除存储过程** + +``` +drop procedure <存储过程名称> +``` + + + +### 3 存储过程的优点 + +允许模块化程序设计 + +执行速度更快 + +减少网络流通量 + +提高系统安全性 + +### 存储过程与函数的区别 + +1.储存过程可以有返回值也可以无返回值。函数必须有返回值。 + +2.存储过程的实现比较复杂,而函数的实现比较有针对性。 + +3.储存过程可以输入输出参数,而函数只可以输入参数。 + +4.过程允许在其中选择以及DML语句,而函数只可以在其中select语句。 + +5.可以在存储过程中调用函数,不可以在函数中调用存储过程。 + +6.函数可以作为条件在语句中使用,但是存储过程不可以。 + +### 存储过程和触发器的区别: + +1、存储过程可以直接使用exec或execute来直接调用或执行存储过程,而触发器只能是设定好的触发相关事件时,会自动执行触发器。 + +2、存储过程有参数,而触发器没有 + +3、存储过程可以有返回值,而触发器无法返回值 + +4、存储过程就好比我们编程中的函数或者方法,触发器就好比是事件,单击事件、加载事件等等。 \ No newline at end of file diff --git "a/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.27and9.28\350\247\246\345\217\221\345\231\250.md" "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.27and9.28\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..f0d8cea --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.27and9.28\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,138 @@ +触发器 + +一、什么是触发器 + + 触发器是在对数据库数据进行增删改操作后,可以自动执行的操作。 + +二、触发器的优点 + + 1、触发器是自动的。当对表中的数据做了任何修改之后立即被激活。 + + 2、触发器可以通过数据库中的相关表进行层叠修改。 + + 3、触发器可以强制限制。 + +三、触发器的作用 + + 1、强制数据库间的引用完整性。 + + 2、级联修改数据库中所有相关的表,自动触发其它与之相关的操作。 + + 3、跟踪变化,撤销或回滚违法操作,防止非法修改数据。 + + 4、返回自定义的错误消息,约束无法返回信息,而触发器可以。 + + 5、触发器可以调用更多的存储过程。 + +四、触发器分类 + +分为 DML触发器和DDL触发器 + +#### DML触发器 : 增删改 + +##### 1.after触发器: + +after触发器主要用于:insert,update,delete + +##### 2.instead of 触发器 + + + +3. + + 1、insert触发器 + + 向表中插入数据时被触发。 + + 2、delete触发器 + + 从表中删除数据时被触发。 + + 3、update触发器 + + 修改表中数据时被触发。(先删后插) + +五、创建触发器 + +```sql + + 1、insert触发器 + +---------创建insert触发器-------- +create trigger trig_insert +on Student +after insert +as +begin + select count(*) from Student +end +``` + +​ + +```sql + 2、delete触发器 + +---------创建delete触发器--------- +create trigger trig_delete +on Student +after delete +as +begin + select ID from deleted +end; + 3、update触发器 + +-------创建update触发器------- +create trigger trig_update +on Student +after update +as +begin + select ID from inserted +end +六、查看触发器 + + 1、查询数据库中的所有触发器 + +---------查看数据库中所有的触发器--------- +use master +go +select * from sysobjects where xtype='TR' + 2、查看触发器内容 + +---------查看数据库中所有的触发器--------- +use master +go +exec sp_helptext '触发器名称' + 3、查看触发器的属性 + +---------查看触发器内容--------- +use master +go +exec sp_helptrigger TableName +七、修改触发器 + +---------修改触发器--------- +alter trigger trig_update +on Student +after update +as +begin + select ID from inserted +end +八、删除触发器 + +---------删除触发器--------- +drop trigger trig_update +``` + + + +inserted表和deleted表存放的信息: + +| 修改操作 | inserted表 | deleted表 | +| ---------------- | ---------------- | ---------------- | +| 增加(INSERT)记录 | 存放新增的记录 | 无 | +| 删除(DELETE)记录 | 无 | 存放被删除的记录 | +| 修改(UPDATE)记录 | 存放更新后的记录 | 存放更新前的记录 | diff --git "a/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.29\344\272\213\345\212\241\351\232\224\347\246\273.md" "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.29\344\272\213\345\212\241\351\232\224\347\246\273.md" new file mode 100644 index 0000000..888f4f4 --- /dev/null +++ "b/44\346\261\237\345\230\211\345\205\264/\347\254\224\350\256\260/9.29\344\272\213\345\212\241\351\232\224\347\246\273.md" @@ -0,0 +1,6 @@ +-- read uncommitted 读未提交 (脏读,不可重复读,幻读) + +-- read commited 读已提交 (不可重复读,幻读) + +-- repeatable read 可重复读 +-- serializable \ No newline at end of file -- Gitee