视图、函数和存储过程
视图(View)
概念
视图是虚拟表,本质是保存的查询语句(SQL)。不存储数据,每次访问时执行查询。
创建与使用
-- 创建视图
CREATE VIEW vw_emp_simple AS
SELECT eno, ename, job, dno FROM tb_emp;
-- 查询视图(像查表一样)
SELECT * FROM vw_emp_simple;
-- 查看所有视图
SHOW TABLES WHERE Tables_in_hrs NOT LIKE 'tb_%';
视图的作用
| 作用 | 说明 |
|---|---|
| 隐藏数据 | 只暴露需要的列(如隐藏薪资字段) |
| 简化查询 | 复杂连接/聚合包装为视图 |
| 安全控制 | 授权用户只能访问视图 |
| 格式转换 | 格式化输出数据 |
限制
以下视图不可更新:
- 使用了聚合函数 /
DISTINCT/GROUP BY/HAVING/UNION SELECT中含子查询FROM引用了不可更新的视图
存储函数(Function)
概念
存储函数是有返回值的 SQL 代码块,可在 SQL 中调用。
示例
DELIMITER // -- 修改定界符
CREATE FUNCTION fun_emp_sal(eno INT)
RETURNS INT
READS SQL DATA
BEGIN
DECLARE sal INT;
SELECT sal INTO sal FROM tb_emp WHERE emp_no = eno;
RETURN IFNULL(sal, 0);
END //
-- 调用
SELECT fun_emp_sal(1001);
-- SQL中调用
SELECT ename, fun_emp_sal(eno) AS 薪资 FROM tb_emp;
存储过程(Procedure)
概念
存储过程是无返回值的可执行代码块,类似无返回值的函数,通过 CALL 调用。
示例
DELIMITER //
-- 无参数存储过程
CREATE PROCEDURE pro_emp_list()
BEGIN
SELECT * FROM tb_emp;
END //
-- 带参数存储过程
CREATE PROCEDURE pro_emp_by_dno(IN dno INT)
BEGIN
SELECT * FROM tb_emp WHERE dno = dno;
END //
-- OUT 参数(返回值)
CREATE PROCEDURE pro_emp_count(OUT cnt INT)
BEGIN
SELECT COUNT(*) INTO cnt FROM tb_emp;
END //
-- INOUT 参数
CREATE PROCEDURE pro_swap(INOUT a INT, INOUT b INT)
BEGIN
DECLARE t INT;
SET t = a; SET a = b; SET b = t;
END //
DELIMITER ; -- 恢复定界符
调用
CALL pro_emp_list(); -- 调用
CALL pro_emp_by_dno(20); -- 传参
SET @cnt = 0;
CALL pro_emp_count(@cnt); -- OUT参数
SELECT @cnt; -- 查看结果
函数 vs 存储过程
| 对比 | 存储函数 | 存储过程 |
|---|---|---|
| 返回值 | ✅ 必须有 | ❌ 可无 |
| 调用位置 | SELECT 中 | CALL 语句 |
| 参数模式 | 仅 IN | IN/OUT/INOUT |
| DML 操作 | ❌ | ✅ |
变量与流程控制
DECLARE total INT DEFAULT 0; -- 声明变量
SET total = 100; -- 赋值
-- 条件
IF score >= 60 THEN
SELECT '及格';
ELSE
SELECT '不及格';
END IF;
-- 循环
WHILE total > 0 DO
SET total = total - 1;
END WHILE;
REPEAT
SET total = total - 1;
UNTIL total = 0 END REPEAT;
总结
- 视图:
CREATE VIEW— 虚拟表,简化查询 + 权限控制 - 存储函数:
CREATE FUNCTION— 有返回值,SELECT 中调用 - 存储过程:
CREATE PROCEDURE— 无返回值,CALL 调用,支持 OUT 参数