@future

MySQL的最终学习,收官阶段

2023-11-16  本文已影响0人  月初yue

这周主要学的是mysql 的一些运行机制,还有一些帮助查询的功能

存储过程和函数介绍:

存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合

存储过程和函数的好处

提高代码的复用性

减少数据在数据库和应用服务器之间的传输,提高效率

减少代码层面的业务处理

存储过程和函数的区别

存储函数必须有返回值

存储过程可以没有返回值

存储过程的创建:

创建存储过程

-- 修改分隔符为$

DELIMITER $

-- 标准语法

CREATE PROCEDURE 存储过程名称(参数列表)

BEGIN

SQL 语句列表;

END$

-- 修改分隔符为分号

DELIMITER ;

*/

-- 创建stu_group()存储过程,封装 分组查询总成绩,并按照总成绩升序排序的功能

DELIMITER $

CREATE PROCEDURE stu_group()

BEGIN

SELECT gender,SUM(score) getSum FROM student GROUP BY gender ORDER BY getSum ASC;

END$

DELIMITER ;

/*

调用存储过程

CALL 存储过程名称(实际参数);

*/

-- 调用stu_group()存储过程

CALL stu_group();

-- 查询存储过程

SELECT *FROM mysql.proc WHERE db='表名';

-- 删除存储过程

DROP PROCEDURE IF EXISTS stu_group;

存储函数:

/*

创建存储函数

CREATE FUNCTION 函数名称([参数 数据类型])

RETURNS 返回值类型

BEGIN

执行的sql语句;

RETURN 结果;

END$

*/

-- 定义存储函数,获取学生表中成绩大于95分的学生数量

DELIMITER $

CREATE FUNCTION fun_test1()

RETURNS INT

BEGIN

-- 定义变量

DECLARE s_count INT;

-- 查询成绩大于95分的数量,为s_count赋值

SELECT COUNT(*) INTO s_count FROM student WHERE score > 95;

-- 返回统计结果

RETURN s_count;

END$

DELIMITER ;

/*

调用函数

SELECT 函数名称(实际参数);

*/

-- 调用函数

SELECT fun_test1();

/*

删除函数

DROP FUNCTION 函数名称;

*/

-- 删除函数

DROP FUNCTION fun_test1;

学完这些存储函数,还紧接着学习了什么事触发器,这个就相对来说抽象且高级一点了

触发器(自动日志备份):

触发器是与表有关的数据库对象,可以在insert,update,delete之前或之后触发并执行触发器中定义的SQL语句.

这种特性可以协助应用系统在数据库端确保数据的完整性·日志记录,数据校验等操作

使用别名NEW和OLD来引用触发器中发生变化的内容记录。

触发器的创建:

-- 创建INSERT型触发器。用于对account表新增数据进行日志的记录

DELIMITER $

CREATE TRIGGER account_insert

AFTER INSERT

ON account

FOR EACH ROW

BEGIN

INSERT INTO account_log VALUES (NULL,'INSERT',NOW(),new.id,CONCAT('插入后{id=',new.id,',name=',new.name,',money=',new.money,'}'));

END$

DELIMITER ;

-- 向account表添加一条记录

INSERT INTO account VALUES (NULL,'王五',2000);

-- 查询account表

SELECT * FROM account;

-- 查询account_log表

SELECT * FROM account_log;

/*

创建触发器

DELIMITER $

CREATE TRIGGER 触发器名称

BEFORE|AFTER INSERT|UPDATE|DELETE

ON 表名

FOR EACH ROW

BEGIN

触发器要执行的功能;

END$

DELIMITER ;

*/

-- 创建UPDATE型触发器。用于对account表修改数据进行日志的记录

DELIMITER $

CREATE TRIGGER account_update

AFTER UPDATE

ON account

FOR EACH ROW

BEGIN

INSERT INTO account_log VALUES (NULL,'UPDATE',NOW(),new.id,CONCAT('更新前{id=',old.id,',name=',old.name,',money=',old.money,'}','更新后{id=',new.id,',name=',new.name,',money=',new.money,'}'));

END$

DELIMITER;

-- 修改account表中李四的金额为2000

UPDATE account SET money=2000 WHERE id=2;

-- 查询account表

SELECT * FROM account;

-- 查询account_log表

SELECT * FROM account_log;

/*

创建触发器

DELIMITER $

CREATE TRIGGER 触发器名称

BEFORE|AFTER INSERT|UPDATE|DELETE

ON 表名

FOR EACH ROW

BEGIN

触发器要执行的功能;

END$

DELIMITER ;

*/

-- 创建DELETE型触发器。用于对account表删除数据进行日志的记录

DELIMITER $

CREATE TRIGGER account_delete

AFTER DELETE

ON account

FOR EACH ROW

BEGIN

INSERT INTO account_log VALUES (NULL,'DELETE',NOW(),old.id,CONCAT('删除前{id=',old.id,',name=',old.name,',money=',old.money,'}'));

END$

DELIMITER;

-- 删除account表中王五

DELETE FROM account WHERE id=3;

-- 查询account表

SELECT * FROM account;

-- 查询account_log表

SELECT * FROM account_log;

-- 查看和删除触发器

-- 查看触发器

SHOW TRIGGERS;

-- 删除触发器

DROP TRIGGER account_delete;

上一篇 下一篇

猜你喜欢

热点阅读