// 视图
// 视图就是基表的映射
// 创建视图
// 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 [(cascaded | local)] check option
// 如果创建视图时增加以上语句,insert数据时mysql会检查该条数据是否满足视图要求,不满足则组织该条请求
// cascaded会检查是否满足该视图以及该视图依赖的所有视图(不管是否加了cascaded)的条件
// local只会检查是否满足当前视图的条件
// 要使视图可更新,视图中的行与基础表中的行必须存在一对一关系,如果视图中包含一下任何一项,则该视图不可更新:
// 聚合函数或窗口函数(sum(), min(), max(), count()等)
// distinct
// group by
// having
// union 或者 union all
// 视图作用
// 简单:视图可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件
// 安全:数据库可以授权,但是不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们能看到的数据
// 数据独立:视图可帮助用户屏蔽真实表结构变化带来的影响。
// ----------------------------------------------------------------------------------------------------------------------------------------------
// 存储过程
// 定义:____是实现经过编译并存储在数据库中的一段sql语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输
// 本质上就是数据库sql语言层面的代码封装与重用
// 类似与创建一个函数
// 创建
// create procedure 存储过程名称([参数列表])
// begin
// --sql语句
// end;
// 注意:在命令行中创建存储过程时,mysql会识别sql语句中的';'从而提前结束sql创建存储过程sql语句,我们需要使用delimiter方法自定义结束符
delimiter $$
create procedure p1()
begin
select * from user;
end$$
delimiter ;
// 调用
// call 名称([参数]);
// 查看指定数据库存储过程及状态信息
// select * from information_schema.routines where routine_schema = 'XXX';
// 查询某个存储过程的定义语法
// show create procedure 存储过程名称;
// 删除
// drop procedure [if exists] 存储过程名称;
// 变量
// 系统变量
// 系统变量分为全局变量global与会话变量session
// 查看系统变量
// show [session | global] variables;
// show [session | global] variables like '...';
// select @@[session | global] 系统变量名; --查看指定变量的值
// 设置系统变量
// set [session | global] 系统变量名 = 值;
// set @@[session | global] 系统变量名 = 值;
// 修改全局变量值之后重启mysql服务器系统变量还是会恢复到默认值
// 想要永久生效需要到/etc/my.cnf中配置
// 用户自定义变量
// 用户变量的作用域只在当前连接
// 赋值
// set @var_name = expr [, @var_name = expr]...;
// set @var_name := expr [, @var_name = expr]...;
// select @var_name := expr [, @var_name := expr]...;
// select 字段名 into @var_name from 表名;
// 使用
// select @var_name;
// 用户变量直接赋值就行,可以不用声明
// 未经过赋值的变量值默认为NULL
// 局部变量
// 局部变量只能在其声明的begin...end块内使用
// 声明
// declare 变量名 变量类型[default...];
// 变量类型有int,bigint,char,varchar,date,time等
// 赋值
// set 变量名 = 值;
// set 变量名 := 值;
// select 字段名 into 变量名 from 表名...;
create procedure p2()
begin
declare stu_count int default 0;
select count(*) into stu_count from student;
select stu_count;
end;
call p2();
// 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_condition then statement_list1
// [when search_condition2 then statement_list2]...
// [else statement_list]
// end case;
// while语法
// while 条件 do
// --sql语句
// end while;
// repeat语法
// repeat
// --sql语句
// until 判断条件
// end;
// repeat类似于do...while 语句,与之不同的是repeat判断的是满足条件退出循环
// loop语法
// leave等价于break
// iterate等价于continue
// 以上二者都需要配合着标记进行使用
// loop就是死循环类似于while(1) 或者是go中while
sum : loop
if n <= 0 then
leave sum;
end if;
set total := total + n;
set n := n - 1;
end loop sum;
// 游标
// 游标是能够存储一张表的数据类型
// 声明
// declare 游标名称 cursor for select语句;
// 打开游标
// 在使用游标之前必须打开游标
// open 游标名称;
// 获取游标记录
// fetch 游标名称 into 变量[, 变量]...;
// 关闭游标
// close 游标名称;
// 游标的声明必须在局部变量声明之前
// 游标遍历时会自动向下一行遍历
// 条件处理程序
// 类比于try
// 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: 所有以 开头的sqlstate代码的简写
// sqlexception: 所有没有被sqlwarning或not found捕获的sqlstate代码的简写
// statement
// 代表判定成功之后执行的操作
// -------------------------------------------------------------------------------------------------------------------------
// 存储函数
// 存储函数就是有返回值的存储过程,存储函数的参数只能是in类型
// create function 存储函数名称([参数列表(必须是in类型)])
// returns type [characteristic...]
// begin
// --sql语句
// return...;
// end;
// characteristic
// deterministic: 相同的输入参数总是产生相同的结果
// no sql: 不包含sql语句
// reads sql data: 包含读取数据的语句,但不包含写入数据的语句
// 存储函数比较类似于一般变成语言函数的写法
create function solve(n int)
returns int deterministic
begin
declare addd int default 0;
while n > 0 do
set addd := addd + n;
set n := n - 1;
end while;
return addd;
end;
select solve(100);
drop function if exists solve;
// -------------------------------------------------------------------------------------------------------------------------
// 触发器
// 与表相关的数据库对象,指的是在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; --如果没有指定schema_name,默认为当前数据库