全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-15 8 分钟 ✍️ juanwangdev

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
返回值返回结果集可返回多个结果集
使用场景简化复杂查询、权限控制业务逻辑封装、批量操作

📝 发现内容有误?点击此处直接编辑

← 上一篇 MySQL 联合查询
下一篇 → MySQL 执行计划分析
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库