MySQL 视图与存储过程
视图与存储过程是 MySQL 封装复杂逻辑的两种重要方式,提高代码复用性与安全性。
视图
定义
视图是虚拟表,基于 SELECT 语句的结果集,不存储实际数据,每次查询动态生成。
创建视图
SQL
-- 基本语法
CREATE VIEW 视图名 AS SELECT语句;
-- 示例:创建员工简明视图
CREATE VIEW v_emp_brief AS
SELECT emp_id, emp_name, dept_id FROM employees WHERE status = 1;
使用视图
SQL
-- 像表一样查询
SELECT * FROM v_emp_brief WHERE dept_id = 10;
-- 修改视图
CREATE OR REPLACE VIEW v_emp_brief AS
SELECT emp_id, emp_name, dept_id, salary FROM employees WHERE status = 1;
-- 删除视图
DROP VIEW IF EXISTS v_emp_brief;
视图限制
- 不支持临时表创建视图
- 视图 SELECT 不能包含子查询(FROM 子句除外)
- 视图更新受限:包含聚合函数、DISTINCT、GROUP BY、HAVING、UNION 的视图不可更新
存储过程
定义
存储过程是一组预编译的 SQL 语句集合,存储在数据库中,可重复调用。
创建存储过程
SQL
-- 基本语法
DELIMITER //
CREATE PROCEDURE 过程名([参数列表])
BEGIN
SQL语句;
END //
DELIMITER ;
-- 示例:无参存储过程
DELIMITER //
CREATE PROCEDURE sp_get_all_depts()
BEGIN
SELECT * FROM departments ORDER BY dept_id;
END //
DELIMITER ;
-- 示例:带参数存储过程
DELIMITER //
CREATE PROCEDURE sp_get_emp_by_dept(IN p_dept_id INT)
BEGIN
SELECT * FROM employees WHERE dept_id = p_dept_id;
END //
DELIMITER ;
-- 示例:带输出参数
DELIMITER //
CREATE PROCEDURE sp_count_emp(IN p_dept_id INT, OUT p_count INT)
BEGIN
SELECT COUNT(*) INTO p_count FROM employees WHERE dept_id = p_dept_id;
END //
DELIMITER ;
调用存储过程
SQL
-- 无参调用
CALL sp_get_all_depts();
-- 有参调用
CALL sp_get_emp_by_dept(10);
-- 输出参数调用
SET @count = 0;
CALL sp_count_emp(10, @count);
SELECT @count;
管理存储过程
SQL
-- 查看存储过程定义
SHOW CREATE PROCEDURE sp_get_emp_by_dept;
-- 删除存储过程
DROP PROCEDURE IF EXISTS sp_get_emp_by_dept;
要点总结
| 特性 | 视图 | 存储过程 |
|---|---|---|
| 本质 | 虚拟表 | 预编译SQL集合 |
| 参数 | 不支持 | 支持IN/OUT/INOUT |
| 返回值 | 返回结果集 | 可返回多个结果集 |
| 使用场景 | 简化复杂查询、权限控制 | 业务逻辑封装、批量操作 |
📝 发现内容有误?点击此处直接编辑