MySQL数据库学习—进阶视图/存储过程/触发器

2025-08-29

视图

视图是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。【似乎就是把查询的表抽出来,当一个临时的表】

视图可以简化用户对数据的理解,也可以简化操作。经常使用查询的可以被定义为视图,从而使用户不必每次查询都指定全部的条件。视图只能查询和修改用户看到的数据,保证敏感数据安全性。数据独立,帮助用户屏蔽真实表结构变化带来的影响。

创建:CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [WITH [CASCADED | LOCAL] CHECK OPTION]
查询:
    查看创建视图语句 SHOW CREATE VIEW 视图名称;
    查看视图数据SELECT * FROM 视图名称……;
修改:
    方式一:CREATE [OR REPLACE] VIEW 视图名称[(列表名称)] AS SELECT语句 [WITH [CASCADED | LOCAL] CHECK OPTION]
    方式二:ALTER VIEW 视图名称[(列表名称)] AS SELECT语句 [WITH [CASCADED | LOCAL] CHECK OPTION]
删除:DROP VIEW [IF EXISTS] 视图名称 [视图名称]……

视图检查选项:使用WITH CHECK OPTION创建视图时,在插入、更新、删除时,MySQL会检查正在更改的行。CASCADED会向前检查关联所有创建视图的条件(哪怕依赖视图没定义)。LOCAL则只是检查当前视图的条件和当前视图依赖视图的条件。

视图的更新:视图中的行和基础表中的行必须一对一才可以更新。以下条件不可更新:聚合函数或者窗口函数、DISTINCT、GROUP BY、HAVING、UNION或UNION ALL

存储过程

存储过程是事先编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。存储过程在思想上很简单,就是数据库SQL语言层面的代码封装和重用。【类似于函数?】

特点:封装、复用。可以接收参数,也可以返回数据。减少网络交互,效率提升。

创建:

CREAT 存储过程名称()
BEGIN
    ...
END;

调用:

CALL 存储过程名称();

查看:

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='XXX';  -- 查询指定数据库的存储过程及状态信息
SHOW CREATE PROCEDURE 存储过程名称;  -- 查询某个存储过程的定义

删除:

DROP PROCEDURE [IF EXIST] 存储过程名称;

变量

系统变量:系统变量时MySQL服务器提供,不是用户定义,属于服务器层面。分为全局变量(GLOBAL)、会话变量(SESSION)。

SHOW [SESSION | GLOBAL] VARIABLES;  --查看所有系统变量
SHOW [SESSION | GLOBAL] VARIABLES LIKE '....';  --可以通过LIKE模糊匹配的方式查找变量
SELECT @@[SESSION | GLOBAL] 系统变量名; --查看指定变量的值

SET [SESSION | GLOBAL] 系统变量名=值;  --设置系统变量
SET @@[SESSION | GLOBAL]系统变量名=值;

用户定义变量:用户根据需要自定义变量。用户变量不用提前声明,在用的时候直接用“@变量名”使用就可以,其作用域为当前连接。

赋值:
SET @var_name=expr [,@var_name = expr]...;
SET @var_name:=expr [,@var_name:=expr]...;
SELECT @var_name:=expr [,@var_name:=expr]...;
SELECT 字段名 INFO @var_name FROM 表名;

使用:
SELECT @var_name;

局部变量:根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN...END块。

DECLARE 变量名 变量类型 [DEFAULT...]; --声明
-- 变量类型就是数据库字段类型 INT\BIGINT\CHAR\VARCHAR\DATE\TIME等
SET 变量名=值;
SET 变量名:=值 ;
SELECT 字段名 INTO 变量名 FROM 表名...;

IF

IF 条件1 THEN 
    ......
ELSEIF 条件2 THEN 
    ......
ELSE
    ......
END IF;

参数

CREATE PROCEDURE 存储过程名称([IN/OUT/INOUT 参数名 参数类型])
BEGIN
    -- SQL语句
END;

CASE

语法一
CASE case_value
    WHEN when_value1 THEN statement_list1
    [WHEN when_value2 THEN statement_list2]...
    [ELSE statement_list]
END CASE;

语法二
CASE
    WHEN search_condition1 THEN statement_list1
    [WHEN when_value2 THEN statement_list2]...
    [ELSE statement_list]
END CASE;

WHILE

WHILE 条件 DO 
    SQL 逻辑...
END WHILE;

REPEAT

REPEAT
    SQL逻辑
    UNTIL 条件
END REPEAT;

LOOP

[begin_label:] LOOP
    SQL逻辑...
END LOOP [end_label];

LEAVE label;  --break
ITERATE label;  -- continue

游标

用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、FETCH和CLOSE,其语法如下:

DECLARE 游标名称 CURSOR FOR 查询语句;
OPEN 游标名称;
FETCH 游标名称 INTO 变量[,变量];
CLOSE 游标名称;

条件处理程序

DECLARE handler_action HANDLER FOR condition_value [, condition_value]... statement;

handler_action
    CONTINUE:继续执行当前程序
    EXIT:终止执行当前程序
condition_value
    SQLSTATE sqlstate_value:状态码,如02000
    SQLWARNING:所有以01开头的SQLSTATE代码的简写
    NOT FOUND:所有以02开头的SQLSTATE代码的简写
    SQLEXCEPTION:所有没有被SQLWARNING或者NOT FOUND 捕获的SQLSTATE 代码的的简写

触发器

触发器是与表有关的数据库对象,指在insert/update/delete之前或者之后,触发并执行触发器中定义的SQL语句集合,触发器这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。

使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他数据库类似。现在触发器只支持行级触发,不支持语句级触发。

-- 创建触发器
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE ON tbl_name FOR EACH ROW --行级触发器
BEGIN
    trigger_stmt;
END;

-- 查看触发器
SHOW TRIGGERS;

-- 删除
DROP TRIGGER [schema_name.]trigger_name;

← 返回