mysql 学习16 视图,存储过程,存储函数,触发器

视图,

视图是一张虚拟存在的表,以方便我们查询。

创建视图

如下的语句中,我们将select 后的数据,作为一个视图 , 视图名字为view_tb_user_1

create or replace view view_tb_user_1 as 
        select tb_user.name,tb_user.age from tb_user ;

datagrip 弄完后,会在views中生成这个视图。

查询视图

表怎么查询,视图就怎么查询

show create view 视图名;

select * from 视图名 where ...;

show create view view_tb_user_1;

select * from view_tb_user_1 where age = 45;

select view_tb_user_1.name from view_tb_user_1 where age = 45;

修改视图

create or replace view view_tb_user_1 as select * from tb_user where id<3;

alter view view_tb_user_1 as select * from tb_user where id<4;

删除视图

drop view if exists view_tb_user_1;

通过视图插入数据

在视图中的一行数据 和 基表中的一行 数据是一一对应的情况下,才能通过视图对表进行插入和更新。

给表中怎么插入数据,就给视图中怎么插入数据。

insert into view_tb_user_1(id,name,age,gender,phone) values(null,'张三丰', 108,'1',18888888888);

通过视图删除数据

通过视图修改数据

通过视图查询数据

创建视图中的检查选项-with cascaded check option

cascaded 会将自己的 with cascaded check option 传递给自己所依赖的视图。

local 则不会

cascaded 是级联的意思,为什么要有 cascaded 和 local 之分呢?原因是我们还可以通过 视图创建视图,例如下面的语句就是使用视图v1 创建了视图v2,原本 v1视图并没有 with cascaded check option的限制,但是当v2创建的的时候添加了 with cascaded check option 后,视图v1也相当于有了 with cascaded check option 选项。

我们在创建视图的时候如果添加了 with cascaded check option 选项,说明增删改的数据一定要符合 create 视图时候的 要求,比如下面的语句,在create 的时候要求id<3,那么我们增删改的时候的选项,也要符合id<3的情况,否则会报语法错。

create or replace view view_tb_user_2 as select id,name from tb_user where id<3 with cascaded check option ;
insert into view_tb_user_2(id,name) values(7,'张三丰');

我们来看 tb_user 中的数据

我们create 一个view ,让id <3的全部都参与进来,该view 命名为 view_tb_user_1

create or replace view view_tb_user_1 as select id,name from tb_user where id<3;

我们现在要添加一个新数据,id=6; 姓名为 张三丰

现在我们想通过视图插入,那么能插入成功吗?由于视图我们是将 id<3的数据过滤出来的。

insert into view_tb_user_1(id,name) values(6,'张三丰');

查看原表,我们发现插入是成功的。

注意,我们插入的时候的时候,用的是视图,但是视图的id都是要小于3的。但是还是插入成功了,

如果我们在create view 的时候,添加了选项,with cascaded check option

create or replace view view_tb_user_2 as select id,name from tb_user where id<3 with cascaded check option ;

插入数据,失败

insert into view_tb_user_2(id,name) values(7,'张三丰');

创建视图中的检查选项-with local check option

视图的作用

安全,比如有些字段不想让user 看到,就可以通过视图过滤掉,让user只有看这个视图的权利。

存储过程,

我们的业务是3和步骤, 查询 张三账户,update 张三的账户,update张三的账户。

客户端三次访问数据库,就意味着3次网络访问,意味着延迟。

存储过程就是解决这个问题的一种方案,我们将常用的 业务逻辑的语句,写成一个集合,这个集合就叫做存储过程

创建存储过程 和 调用存储过程

查看存储过程 和 删除存储过程

 

设置 SQL的结束语句 delimiter ,我们可以通过delimiter设置mysql结束语句的符号,

为什么这么做呢?是因为在 创建存储过程的语法中,可能需要多个;如果用默认的;结束,在data grip 中没有问题,但是mysql的自己的界面中,会有问题,遇到第一个;就结束了,因此可能还会说你的语法不正确。

系统变量

查看系统变量

show variables;  如果不加  global 或者 session ,默认是session的。

设置系统变量

设置用户变量

不用提前声明,使用的时候 @变量名   就可以,作用域 为当前连接

查看用户变量

还可以通过select 语句给变量赋值

局部变量的声明 赋值 和使用

存储过程 if 语句

call p3();

存储过程的参数

存储过程 case 语句

 

存储过程 while 语句

存储过程 repeat 类似于java 和 C 的 do while

存储过程loop语句

存储过程游标

我们前面可以使用自定义变量接受 select 查找到的一个数据,但是如果是 结果集,应该怎么处理呢?这里就要使用游标

//注意的点,在游标中使用到的 uname,upro 需要在游标之前定义。

存储过程,条件处理程序

上述的存储过程是有bug 的,因为 while true do 没有跳出循环的条件,因此会一直循环下去,到最后一条数据被处理后,再找不到数据了,

要处理这个bug,就要用到下面的 条件处理程序。

改动上面的例子:

这个理的02000 对应的是 error 提示的语句。

除了写02000 还可以写上面的NOT FOUND,NOT found 代表的所有以02开头的SQLSTATE代码的简写。

存储函数

触发器

创建触发器,

查看触发器

删除触发器

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值