MySQL游标是一种数据库对象,它用于在数据库查询过程中迭代访问结果集中的每一行。游标可以被看作是一个指向查询结果集的指针,通过移动游标,可以按行读取和处理结果集的数据。在MySQL中,游标可以用于在存储过程或函数中处理复杂的业务逻辑,例如逐行处理查询结果、循环操作数据等。使用游标可以让我们更加灵活地处理结果集。
游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明。如果我们想要使用游标,一般需要经历四个步骤。不同的 DBMS 中,使用游标的语法可能略有不同
使用DECLARE关键字来声明游标,其语法的基本形式如下:
DECLARE cursor_name CURSOR FOR select_statement;
要使用 SELECT 语句来获取数据结果集,而此时还没有开始遍历数据,这里 select_statement 代表的是SELECT 语句,返回一个用于创建游标的结果集。比如:
DECLARE cur_score CURSOR FOR
SELECT stu_id,grade FROM score;
OPEN 游标名称
-- 例如
open cur_score;
这句的作用是使用 cursor_name 这个游标来读取当前行,并且将数据保存到 var_name 这个变量中,游标指针指到下一行。如果游标读取的数据行有多个列名,则在 INTO 关键字后面赋值给多个变量名即可。
注意:var_name必须在声明游标之前就定义好.
FETCH cursor_name INTO var_name [, var_name] ...
FETCH cur_score INTO stu_id, grade ;
注意:游标的查询结果集中的字段数,必须跟 INTO 后面的变量数一致,否则,在存储过程执行的时候,MySQL 会提示错误
CLOSE 游标名称;
CLOSE cur_score;
创建一个存储过程,实现累加考试成绩最高的几个学员的总分,直到总和大于我们传入的limit_total_grade的参数值,并且返回累加的人数:total_count;
CREATE PROCEDURE PROC_CURSOR(IN LIMIT_TOTAL_GRADE INT, OUT TOTAL_COUNT INT )
BEGIN
# 声明相关的变量
DECLARE SUM_GRADE INT DEFAULT 0; # 累加的总成绩
DECLARE CURSOR_GRADE INT DEFAULT 0; # 记录某条成绩
DECLARE SCORE_COUNT INT DEFAULT 0; # 记录累加的记录数
# 定义游标
DECLARE SCORE_CURSOR CURSOR FOR SELECT GRADE FROM SCORE ORDER BY GRADE ;
# 打开游标
OPEN SCORE_CURSOR;
# 使用游标
REPEAT
FETCH SCORE_CURSOR INTO CURSOR_GRADE; # 从游标中获取一条数据
SET SUM_GRADE = SUM_GRADE + CURSOR_GRADE; # 成绩累加
SET SCORE_COUNT = SCORE_COUNT + 1; # 记录累加的次数
UNTIL SUM_GRADE > LIMIT_TOTAL_GRADE # 退出条件
END REPEAT ;
# 复制OUT参数
SET TOTAL_COUNT = SCORE_COUNT;
# 关闭游标
CLOSE SCORE_CURSOR;
END;
DROP PROCEDURE PROC_CURSOR
# 调用存储过程
SET @s_count = 0;
CALL PROC_CURSOR(400,@s_count) ;
SELECT @s_count;
MySQL触发器是MySQL数据库中的一种特殊对象,它允许在表中插入、更新或删除数据时自动执行一系列指定的操作。触发器可以在特定的数据库操作(例如INSERT、UPDATE、DELETE)发生时被触发。MySQL触发器可以用于实现各种自动化任务和业务逻辑。它们可以执行诸如数据验证、审计记录、数据同步等操作。通过触发器,可以在数据库层面上处理数据相关的逻辑,避免了在应用程序中手动编写重复的代码。
CREATE TRIGGER 触发器名称
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW
触发器执行的语句块;
说明:
创建案例表
CREATE TABLE test_trigger (
id INT PRIMARY KEY AUTO_INCREMENT,
t_note VARCHAR(30) );
CREATE TABLE test_trigger_log (
id INT PRIMARY KEY AUTO_INCREMENT,
t_log VARCHAR(30)
);
创建触发器:创建名称为before_insert的触发器,向test_trigger数据表插入数据之前,向test_trigger_log数据表中插入before_insert的日志信息。
CREATE TRIGGER BEFORE_INSERT
BEFORE INSERT ON TEST_TRIGGER
FOR EACH ROW
BEGIN
INSERT INTO TEST_TRIGGER_LOG(T_LOG)VALUES('BEFORE_INSERT ....') ;
END;
向test_trigger中插入对应的记录
insert into test_trigger(t_note)values('test data');
查看test_trigger_log中是否有记录
select * from test_trigger_log;
方式1:查看当前数据库的所有触发器的定义
SHOW TRIGGERS\G
方式2:查看当前数据库中某个触发器的定义
SHOW CREATE TRIGGER 触发器名
方式3:从系统库information_schema的TRIGGERS表中查询“salary_check_trigger”触发器的信息
SELECT * FROM information_schema.TRIGGERS;
DROP TRIGGER IF EXISTS 触发器名称;