MySQL高级篇——索引、视图、存储过程和函数、触发器的相关概念及操作(下)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL高级篇——索引、视图、存储过程和函数、触发器的相关概念及操作 (下)

文章目录:


3.4 删除存储过程

3.5 存储过程中常用语法

3.5.1 声明变量、变量赋值

3.5.2 if条件判断

3.5.3 传递参数

3.5.4 case结构

3.5.5 while循环

3.5.6 repeat循环

3.5.7 loop + leave循环

3.5.8 游标/光标

3.6 存储函数

4.触发器

4.1 创建触发器

4.1.1 insert型触发器

4.1.2 update型触发器

4.1.3 delete型触发器

4.2 查看触发器

4.3 删除触发器


3.4 删除存储过程

DROP PROCEDURE [IF EXISTS] sp_name;


3.5 存储过程中常用语法

3.5.1 声明变量、变量赋值

通过 DECLARE 可以定义一个局部变量,该变量的作用范围只能在 BEGIN…END 块中。

直接赋值使用 SET,可以赋常量或者赋表达式,具体语法如下:

 DECLARE var_name[,...] type [DEFAULT value] 
 SET var_name = expr [, var_name = expr] ...


也可以通过select ... into 方式进行赋值操作 :


3.5.2 if条件判断

if search_condition then statement_list
[elseif search_condition then statement_list] ...
[else statement_list]
end if;


3.5.3 传递参数

create procedure procedure_name([in/out/inout] 参数名  参数类型)
...
IN :  该参数可以作为输入,也就是需要调用方传入值 , 默认
OUT:  该参数作为输出,也就是该参数可以作为返回值
INOUT: 既可以作为输入参数,也可以作为输出参数


@description : 这种变量要在变量名称前面加上“@”符号,叫做用户会话变量,代表整个会话过程他都是有作用的,这个类似于全局变量一样。

@@global.sort_buffer_size : 这种在变量前加上 "@@"符号, 叫做系统变量 


3.5.4 case结构

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE;


3.5.5 while循环

while search_condition do
    statement_list
end while;


3.5.6 repeat循环

有条件的循环控制语句, 当满足条件的时候退出循环while 是满足条件才执行,repeat 是满足条件就退出循环。

REPEAT
    statement_list
    UNTIL search_condition
END REPEAT;


3.5.7 loop + leave循环

LOOP实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用 LEAVE 语句实现,具体语法如下:

[begin_label:] LOOP
    statement_list
END LOOP [end_label]

如果不在 statement_list 中增加退出循环的语句,那么 LOOP 语句可以用来实现简单的死循环。


3.5.8 游标/光标

游标是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明、OPENFETCH CLOSE,其语法分别如下。

声明光标:

DECLARE cursor_name CURSOR FOR select_statement;

OPEN光标:

OPEN cursor_name;

FETCH光标:

FETCH cursor_name INTO var_name [, var_name] ...

CLOSE光标:

CLOSE cursor_name;

下面,为了演示光标的案例,先创建一张emp表。

create table emp(
    id int(11) not null auto_increment ,
    name varchar(50) not null comment '姓名',
    age int(11) comment '年龄',
    salary int(11) comment '薪水',
    primary key(`id`)
)engine=innodb default charset=utf8;
insert into emp(id,name,age,salary) 
values(null,'金毛狮王',55,3800),(null,'白眉鹰王',60,4000),(null,'青翼蝠王',38,2800),(null,'紫衫龙王',42,1800);

下面第一种方法是逐行获取光标,从中取出数据。


上面逐行获取的方法虽然可行,但是如果数据过多,则显得代码量较大、冗余度较高。

所以下面采用repeat循环的方法来获取光标。(截图中的Display请忽略,应该是粘贴的时候格式有点问题)


3.6 存储函数

CREATE FUNCTION function_name([param type ... ])
RETURNS type
BEGIN
...
END;

4.触发器


触发器是与表有关的数据库对象,指在insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性 , 日志记录 , 数据校验等操作


使用别名 OLD NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。


4.1 创建触发器

create trigger trigger_name
before/after insert/update/delete
on tbl_name
[ for each row ]  -- 行级触发器
begin
    trigger_stmt ;
end;

为了测试,这里首先创建一张emp_logs表,用来记录触发器相关的操作日志信息。

create table emp_logs(
    id int(11) not null auto_increment,
    operation varchar(20) not null comment '操作类型, insert/update/delete',
    operate_time datetime not null comment '操作时间',
    operate_id int(11) not null comment '操作表的ID',
    operate_params varchar(500) comment '操作参数',
    primary key(`id`)
)engine=innodb default charset=utf8;

4.1.1 insert型触发器

创建完insert型触发器之后,执行两条insert语句,即可在 emp_logs 表中看到信息。

create trigger emp_logs_insert_trigger
after insert 
on emp
for each row
begin
  insert into emp_logs(id,operation,operate_time,operate_id,operate_params)
  values(null,'insert',now(),new.id,concat('插入后(id:',new.id,', name:',new.name,',
age:',new.age,', salary:',new.salary,')'));
end$
insert into emp(id,name,age,salary) values(null, '光明左使',30,3500);
insert into emp(id,name,age,salary) values(null, '光明右使',33,3200);


4.1.2 update型触发器

创建完update型触发器之后,执行update语句,即可在 emp_logs 表中看到信息。

1.  create trigger emp_logs_update_trigger

2.  after update

3.  on emp

4.  for each row

5.  begin

6.   insert into emp_logs(id,operation,operate_time,operate_id,operate_params)

7.   values(null,'update',now(),new.id,concat('修改前(id:',old.id,', name:',old.name,',

8.  age:',old.age,', salary:',old.salary,') , 修改后(id',new.id, 'name:',new.name,',

9.  age:',new.age,', salary:',new.salary,')'));

10.  end$

11.   

12.  update emp set age = 39 where id = 3;


4.1.3 delete型触发器

创建完delete型触发器之后,执行delete语句,即可在 emp_logs 表中看到信息。

create trigger emp_logs_delete_trigger
after delete
on emp
for each row
begin
  insert into emp_logs(id,operation,operate_time,operate_id,operate_params)
  values(null,'delete',now(),old.id,concat('删除前(id:',old.id,', name:',old.name,',
age:',old.age,', salary:',old.salary,')'));
end$
delete from emp where id = 5;


4.2 查看触发器

show triggers;

4.3 删除触发器

drop trigger [schema_name.]trigger_name;
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
27天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
131 9
|
10天前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
65 22
 MySQL秘籍之索引与查询优化实战指南
|
5天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合
2024年小结:感谢阿里云开发者社区每月的分享交流活动,支持持续学习和进步。过去五个月投稿29篇,其中17篇获高分认可。本文详细介绍了MySQL InnoDB存储引擎的MVCC机制,包括数据版本链、readView视图及解决脏读、不可重复读、幻读问题的demo演示。
|
11天前
|
存储 关系型数据库 MySQL
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
49 10
|
24天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
53 8
|
19天前
|
存储 关系型数据库 MySQL
【MYSQL】 ——索引(B树B+树)、设计栈
索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈
|
21天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
47 3
|
21天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
54 3
|
21天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
72 2
|
1月前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
227 15