视图
视图语法
CREATE OR REPLACE VIEW view_name AS SELECT子句 WITH [CASCADED(默认)|LOCAL] CHECK OPTION;
注意CASCADED和LOCAL的作用和区别。
视图更新
并不是所有视图都是可更新(插入)的
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:
- 聚合函数或窗口函数(SUM(), MIN(), MAX(), COUNT()等)
- DISTINCT
- GROUP BY
- HAVING
- UINON 或 UNION ALL
- 其他
视图的作用
- 简单:可以封装复杂的select操作。
- 安全: 只向用户展示部分字段。
- 数据独立:帮助用户屏蔽真实表的变化。
存储过程
- 存储过程是事先经过编译并且存储在数据库中的一段SQL语句的集合,开发人员可以直接调用存储过程,从而减少数据在数据库和应用服务器之间的传输。
- 说白了,存储过程就是数据库SQL语言层面的代码封装与重用。
- 同时,存储过程可以接收参数,也可以返回数据。
存储过程语法
# 创建存储过程
CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN
--SQL语句
END;
# 注意:在命令行中定义存储过程时,需要通过delimiter关键字指定SQL语句的结束符。
delimiter $$
CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN
--SQL语句;
END$$
delimiter ;
# 调用存储过程
CALL 存储过程名称([参数列表]);
# 查看存储过程信息
# 查看数据库中有哪些存储过程
SELECT * FROM imformation_schema.ROUTINES WHERE ROUTINE_SCHEMA = '数据库名称';
# 查看某一存储过程的创建信息
SHOW CREATE PROCEDURE 存储过程名称;
# 删除
DROP PROCEDURE [IF EXISTS] 存储过程名称;
变量
-
系统变量:由mysql服务器提供,不是用户定义的。分为全局变量(global)和会话变量(session)。
-- 查看系统变量 SHOW [SESSION(默认)|GLOBAL] VARIABLES; SHOW [SESSION(默认)|GLOBAL] VARIABLES LIKE '...'; SELECT @@[SESSION.(默认)|GLOBAL.]系统变量名; -- 设置系统变量 set [SESSION(默认)|GLOBAL] 系统变量名=值; set @@[SESSION.(默认)|GLOBAL.]系统变量名=值;
mysql服务重启后,所设置的全局参数会失效,要想永久不失效,则需在mysql系统配置文件.cnf当中配置。
-
用户定义变量:用户自己定义的变量,只在当前连接有效。
-- 赋值 set @变量名 = expr [,@变量名 = 值,...]; set @变量名 := expr [,@变量名 := 值,...]; select @变量名 := expr[,@变量名 := expr,...]; select 字段 into @变量名 from 表名; -- 变量赋值推荐采用":=",为了和比较"="区分开。 --使用 select @变量名;
用户定义变量无需声明,也可以不进行初始化,不初始化默认为NULL。
-
局部变量:根据需要,定义在BEGIN…END块内部的变量。
--声明 DECLARE 变量名 变量类型[DEFAULT]; --赋值 SET 变量名=值; SET 变量名:=值; SELECT 字段名 INTO 变量名 FROM 表名...; --查看 SELECT 变量名;
存储过程中的语法及控制语句
if判断
IF 条件 THEN
...;
ELSEIF 条件 THEN
...;
ELSE
...;
ENDIF;
参数(IN, OUT, INOUT)
类型 | 含义 | 备注 |
---|---|---|
IN | 输入参数 | 默认 |
OUT | 输出,即返回值 | |
INOUT | 既可以做输入,也可以做输出 |
create procedure pro_name([IN/OUT/INOUT 参数名 参数数据类型])
begin
...
end;
-- 调用示例
call pro_name(68, @myvar); --我们设定68是输入参数。myvar是用户定义变量,接收输出参数值。
case
if else实现同样的功能
case
when 条件 then
...;
when 条件 then
...;
when 条件 then
...;
...
else
...;
end case;
循环
-
while
while 条件 do ... end while;
-
repeat
repeat ... until 条件 end repeat;
-
loop
loop实现简单的循环,如果不在逻辑语句中增加退出循环条件,那么就是死循环,loop配合下面两个语句使用:
- leave:退出循环 (类比break)。
- iterate:跳过当前循环剩下的语句,直接进入下一次循环(类比continue)。
[begin_label:] LOOP SQL逻辑... END LOOP [endl_label]; LEAVE label; ITERATE label;
游标
cursor是一种数据类型,用来存储查询结果集。在存储过程和函数中可以使用游标对结果集进行循环的处理。
-- 声明游标,游标的声明应该在普通变量的声明之后。
DECLARE 游标名称 CURSOR FOR 查询语句;
-- 打开游标
OPEN 游标名称
-- 获取游标记录
FETCH 游标名称 INTO 变量[,变量];
-- 关闭游标
CLOSE 游标名称;
条件处理程序
条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。(有点像异常处理机制)
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代码的简写
https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html
存储函数
存储函数是有返回值的存储过程,存储函数的参数只能是IN类型的。
CREATE FUNCTION 存储函数名称([参数列表])
RETURNS type [characteristic ...]
BEGIN
--SQL语句
RETURN ...;
END;
characteristic说明:
* DETERMINISTIC:相同的输入参数总是产生相同的结果
* NO SQL:不包含SQL语句
* READS SQL DATA:包含读取数据的语句,但不包含写入数据的语句。
触发器
--创建触发器
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; --如果没有指定schema_name,默认为当前数据库