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;
参数
IN:该类参数作为输入
OUT:该类参数作为输出
INOUT:既可以作为输入参数也可以作为输出参数
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;