1. 存储过程的作用是什么?
存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。主要作用包括:
-
性能优化:预编译执行,速度比单个SQL语句快
-
代码重用:可重复调用,减少重复代码
-
安全性:限制用户直接访问数据库表
-
事务管理:实现复杂的事务逻辑
-
降低耦合:表结构变化时只需修改存储过程
2. 如何创建一个存储过程?
DELIMITER //
CREATE PROCEDURE 存储过程名([IN/OUT/INOUT 参数名 参数类型] [,...])
BEGIN
-- SQL语句
END //
DELIMITER ;
3. MySQL中的变量都有哪几种?
-
系统变量:MySQL服务器的配置变量
-
用户自定义变量:在SQL会话中定义的变量
-
局部变量:在存储过程、函数或触发器范围内有效的变量
4. 如何定义一个变量?
用户自定义变量:
SET @var_name = expr;
SET @var_name := expr;
SELECT @var_name := expr;
SELECT 列名 INTO @var_name FROM 表名;
局部变量:
DECLARE 变量名 变量类型 [DEFAULT 默认值];
5. MySQL中使用变量是否需要提前声明?
-
用户自定义变量:不需要提前声明
-
局部变量:必须在使用前声明
6. MySQL中的参数分为哪几种?
-
IN:输入类型(默认)
-
OUT:输出类型,可作为返回值
-
INOUT:输入输出类型
7. 用过游标吗?游标的作用是什么?
游标用于在存储过程中对查询结果集进行逐行检索。使用步骤:
-
声明游标:
DECLARE 游标名 CURSOR FOR 查询语句; -
打开游标:
OPEN 游标名; -
获取记录:
FETCH 游标名 INTO 变量; -
关闭游标:
CLOSE 游标名;
8. 了解条件处理程序吗?介绍一下如何使用
条件处理程序用于处理程序执行过程中的异常:
DECLARE handler_action HANDLER
FOR condition_value [, condition_value] ...
statement
-- 示例:处理游标越界
DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_done := TRUE;
9. 存储函数与存储过程的区别是什么?
-
存储函数必须有返回值,存储过程不一定
-
存储函数参数只能是IN类型
-
存储函数类似于内置函数,可直接在SQL中使用
10. 如何查看数据库中创建的存储过程?
-- 查看指定数据库的存储过程
SELECT * FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = '数据库名';
-- 查看存储过程定义
SHOW CREATE PROCEDURE 存储过程名;
11. 什么是触发器?
触发器是与表关联的数据库对象,在对表进行INSERT、UPDATE、DELETE操作时自动执行预定义的SQL语句。
12. MySQL中触发器分为几种类型?
按操作类型分为:
-
INSERT触发器
-
UPDATE触发器
-
DELETE触发器
13. 行级触发器与语句级触发器的区别是什么?
-
行级触发器:对每一行数据操作都会触发
-
语句级触发器:整个语句执行只触发一次
-
MySQL只支持行级触发器
14. 说一下了解的触发器使用场景都有哪些?
-
数据审计:记录数据变更日志
-
数据验证:实施复杂的业务规则
-
数据同步:维护相关表的数据一致性
-
自动计算:维护衍生数据
15. 如果对一表中的数据进行更新,要在日志表中记录该条记录更新前与更新后的值,如何实现?
使用UPDATE触发器,通过OLD和NEW关键字访问新旧值:
CREATE TRIGGER trg_student_update
AFTER UPDATE ON student FOR EACH ROW
BEGIN
INSERT INTO student_log(operation_type, operation_time, operation_id, operation_data)
VALUES('update', NOW(), NEW.id,
CONCAT(OLD.id,',',OLD.name,...,'|',NEW.id,',',NEW.name,...));
END;
16. 如何查看数据库中创建的触发器?
SHOW TRIGGERS;
-- 删除触发器
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name;