侧边栏壁纸
博主头像
phphi

phphi's blog

  • 累计撰写 51 篇文章
  • 累计收到 0 条评论

Day42 - 视图、函数和过程

2026-4-24 / 0 评论 / 1 阅读

视图、函数和存储过程

视图(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 参数