From 8b42528cd307cfd9632936d5651f2f2890b33e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E5=91=A8=E6=B3=BD=E5=BC=BA=E2=80=9D?= <“2944697776@qq.com”> Date: Wed, 28 Sep 2022 11:21:39 +0800 Subject: [PATCH] 12 --- ...50\345\255\230\350\277\207\347\250\213.md" | 46 +++++++++ .../\345\207\275\346\225\260.md" | 64 +++++++++++++ .../2022-9-21\345\207\275\346\225\260.md" | 71 ++++++++++++++ .../2022-9-22\346\255\273\351\224\201.md" | 40 ++++++++ ...30\345\202\250\350\277\207\347\250\213.md" | 95 +++++++++++++++++++ ...27\350\247\246\345\217\221\345\231\250.md" | 63 ++++++++++++ 6 files changed, 379 insertions(+) create mode 100644 "12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/\345\202\250\345\255\230\350\277\207\347\250\213.md" create mode 100644 "12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/\345\207\275\346\225\260.md" create mode 100644 "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-21\345\207\275\346\225\260.md" create mode 100644 "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-22\346\255\273\351\224\201.md" create mode 100644 "12 \345\221\250\346\263\275\345\274\272/\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 "12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-27\350\247\246\345\217\221\345\231\250.md" diff --git "a/12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/\345\202\250\345\255\230\350\277\207\347\250\213.md" "b/12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/\345\202\250\345\255\230\350\277\207\347\250\213.md" new file mode 100644 index 0000000..5f6eb4c --- /dev/null +++ "b/12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/\345\202\250\345\255\230\350\277\207\347\250\213.md" @@ -0,0 +1,46 @@ +--1. 定义存储过程实现查询出账户余额最低的银行卡账户信息,显示银行卡号,姓名,账户余额 +go +create proc proc_MinMoneyCard +as +begin +select top 1 CardNo 银行卡号,RealName 姓名,CardMoney 余额 from BankCard +inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId +order by CardMoney asc +end +go + +exec proc_MinMoneyCard +--2. 模拟银行卡存钱操作,传入银行卡号,存钱金额,实现存钱操作 +go +create proc proc_CunQian +@CardNo varchar(30), +@MoneyInBank money +as +update BankCard set CardMoney = CardMoney + @MoneyInBank where CardNo = @CardNo +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values(@CardNo,@MoneyInBank,0,GETDATE()) + +exec proc_CunQian '62251254785444557',6000 + +--3. 模拟银行卡取钱操作,传入银行卡号,取钱金额,实现取钱操作,取钱成功,返回1,取钱失败返回-1 + +create proc proc_Quqian +@CardNo varchar(30), +@Money money +as + update BankCard set CardMoney=CardMoney-@Money + where CardNo=@CardNo + if @@ERROR<>0 + return -1 + insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) + values(@CardNo,0,@Money,GETDATE()) + return 1 + +go + + + +declare @returnValue int +exec @returnValue =proc_Quqian '6225125478544587',2000 +select @returnValue + diff --git "a/12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/\345\207\275\346\225\260.md" "b/12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/\345\207\275\346\225\260.md" new file mode 100644 index 0000000..eb4035a --- /dev/null +++ "b/12 \345\221\250\346\263\275\345\274\272/\344\275\234\344\270\232/\345\207\275\346\225\260.md" @@ -0,0 +1,64 @@ +--(1)编写一个函数求该银行的金额总和 +go +create function GetSumMoney() + +returns money + +as +begin +declare @sum money +select @sum = sum(CardMoney) from BankCard +return @sum +end + +go +select dbo.GetSumMoney() + +--(2)传入账户编号,返回账户真实姓名 + +select * from AccountInfo + +go +create function getnameid(@accid int) +returns varchar(10) + +as +begin +declare @name varchar(10) +select @name = realname from AccountInfo where AccountId = @accid +return @name +end + +--drop function getnameid +go +select dbo.getnameid(2) 姓名 + + + +--(3)传递开始时间和结束时间,返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 + +create function GetRecordByTime(@start varchar(30),@end varchar(30)) +returns @result table +( + RealName varchar(30), + CardNo varchar(30), + MoneyInBank money, + MoneyOutBank money, + ExchangeTime smalldatetime +) +as +begin +insert into @result +select RealName 姓名, CardExchange.CardNo 卡号,MoneyInBank 存钱金额,MoneyOutBank 取钱金额,ExchangeTime 交易时间 +from CardExchange +inner join BankCard on CardExchange.CardNo=BankCard.CardNo +inner join AccountInfo on AccountInfo.AccountId=BankCard.AccountId +where ExchangeTime between @start+' 00:00:00' and @end+' 23:59:59' +return + +end + + + +select*from GetRecordByTime('2021-1-1','2021-8-31') + diff --git "a/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-21\345\207\275\346\225\260.md" "b/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-21\345\207\275\346\225\260.md" new file mode 100644 index 0000000..d520b5e --- /dev/null +++ "b/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-21\345\207\275\346\225\260.md" @@ -0,0 +1,71 @@ +## 函数 + +函数分为(1)系统函数:,(2)自定义函数(方法:将一个功能封装成可重用的函数)。 + +其中自定义函数又可以分为(1)标量值函数(返回单个值),(2)表值函数(返回查询结果) + +本文主要介绍自定义函数的使用。 + +#### 标量值函数 + +标量函数:标量函数是对单一值操作,返回单一值。 + +语法结构: + +```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 函数名 +``` + diff --git "a/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-22\346\255\273\351\224\201.md" "b/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-22\346\255\273\351\224\201.md" new file mode 100644 index 0000000..69b8e15 --- /dev/null +++ "b/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-22\346\255\273\351\224\201.md" @@ -0,0 +1,40 @@ +**死锁** + +当两个事务分别锁定了资源,而又继续请求对方已获取的资源,那么就会产生死锁。 + +**发生死锁的原因:** + +A、会话以不同的顺序访问表。 + +B、会话长时间运行事务,在一个事务中更新了很多表或行,这样增加了冲突的可能。 + +C、会话1申请了一些行锁,会话2申请了一些行锁,之后决定将其升级为表锁。 + + + +产生原因: +所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB。 + +死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。 + +那么对应的解决死锁问题的关键就是:让不同的session加锁有次序 + + + +避免阻塞方法 + +1 .对每个查询使用查询超时。 + +2 .对每个查询使用锁定超时。有关更多信息,请参见自定义锁超时。 + +3 .使用绑定连接。有关更多信息,请参见使用绑定连接。 + +4 .SQL Server 本质上是受客户端应用程序操纵的傀儡。客户端应用程序对服务器上获取的锁几乎有完全的控制(并对锁负责)。虽然 SQL Server 锁管理器自动使用锁保护事务,但这受客户端应用程序发出的查询类型和对结果的处理方式的直接鼓动。因此,大多数阻塞问题的解决方案都涉及检查客户端应用程序。 + +5 .阻塞问题常要求检查应用程序提交的 SQL 语句本身,以及检查与连接管理、所有结果行的处理等有关的应用程序行为本身。如果开发工具不允许显式控制连接管理、查询超时、结果处理等,阻塞问题可能得不到解决。 + +查询 + +1,查询所有进程锁(exec sp_lock) + +2,查询指定进程n的锁( exec sp_lock n) \ No newline at end of file diff --git "a/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-26\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/12 \345\221\250\346\263\275\345\274\272/\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..701a74a --- /dev/null +++ "b/12 \345\221\250\346\263\275\345\274\272/\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,95 @@ +## 存储过程(Stored Procedure) + +**1.存储过程的概念** + +存储过程:已[预编译](https://so.csdn.net/so/search?q=预编译&spm=1001.2101.3001.7020)为一个可执行过程的一个或多个SQL语句的集合。 + +2.创建存储过程的语法 + +``` +create procedure proc_name + +[ + +{@参数数据类型} [=默认值] [output], + +{@参数数据类型} [=默认值] [output] + +] + +as + +SQL_statements +``` + +3.删除存储过程: + +``` +if (exists(select * from sysobjects where name=‘proc_name’)){ + +drop proc_name + +} +``` + +**创建存储过程:** + +``` +create procedure proc_name + +as + +begin + +select * from 《表名》 + +end +``` + +**5.调用存储过程** + +``` +exec proc_name +``` + +**执行存储过程** + +```sql +--无参 +exec <存储过程名称> +--带参 +exec <存储过程名称> <形参1>,<形参2>,... +--带参带返回值 +declare @变量 +exec @变量 = <存储过程名称> <形参1>,<形参2>,... +--有输入参数,有输出参数的存储过程 +declare @变量 +exec <存储过程名称> <形参1>,<形参2>,@变量 output +--一个变量同时具备输入输出功能 +declare @变量 <数据类型> = 值 +exec <存储过程名称> <形参1>,<形参2>,@变量 output +``` + + + +**删除存储过程** + +```sql +drop procedure <存储过程名称> +``` + +**存储过程的优劣势** + +优势:提高性能,降低网络开销,便于进行代码移植,有更强的安全性 + +劣势:他需要专门的数据库开发人员维护,设计逻辑变更,修改存储过程没有sql灵活 + +**常见的系统存储过程** + +exec sp_databases 查看数据库 + +exec sp_tables 查看表 + +exec sp_columns 《表名》 查看数据表的列 + +exec sp_stored_procedures 查看存储过程 \ No newline at end of file diff --git "a/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-27\350\247\246\345\217\221\345\231\250.md" "b/12 \345\221\250\346\263\275\345\274\272/\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..408c29b --- /dev/null +++ "b/12 \345\221\250\346\263\275\345\274\272/\347\254\224\350\256\260/2022-9-27\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,63 @@ +## 触发器 + +MySQL触发器简介 +在MySQL中,触发器是一组SQL语句,当对关联表上的数据进行更改时会自动调用这些语句。可以定义触发器在INSERT,UPDATE或DELETE语句更改数据之前或之后调用。在MySQL 5.7.2版之前,可以为每个表定义最多六个触发器。 + +BEFORE INSERT - 在将数据插入表格之前激活。 +AFTER INSERT - 将数据插入表格后激活。 +BEFORE UPDATE - 在更新表中的数据之前激活。 +AFTER UPDATE - 更新表中的数据后激活。 +BEFORE DELETE - 在从表中删除数据之前激活。 +AFTER DELETE - 从表中删除数据后激活。 + +#### 触发器分类 + +分为 DML触发器和DDL触发器 + +#### DML触发器 : 增删改 + +##### after触发器: + +after触发器主要用于:insert,update,delete + +##### instead of 触发器 + +MySQL触发器限制 +MySQL触发器不能: + +使用SHOW,LOAD DATA,LOAD TABLE,BACKUP DATABASE,RESTORE,FLUSH和RETURN语句。 +使用隐式或显式提交或回滚的语句,例如COMMIT,ROLLBACK,START TRANSACTION,LOCK / UNLOCK TABLES,ALTER,CREATE,DROP, RENAME。 +使用 准备语句 PREPARE和EXECUTE之类的 +使用动态SQL语句。 + +#### 创建触发器的语句 + +```sql +CREATE TRIGGER <触发器名称> + +ON table_name + +[WITH ENCRYPTION] + +FOR [DELETE, INSERT, UPDATE] + +AS + + T-SQL语句 + +GO +--WITH ENCRYPTION表示加密触发器定义的SQL文本 + +--DELETE, INSERT, UPDATE指定触发器的类型 +``` + +## 总结 + + 1.插入操作(Insert) +***\*inserted 表\****有数据,***\*deleted 表\****无数据 + +2.删除操作(Delete) +***\*inserted 表\****无数据,***\*deleted 表\****有数据 + +3.更新操作(Update) +***\*inserted 表\****有数据(新数据),***\*deleted 表\****有数据(旧数据) \ No newline at end of file -- Gitee