视图,
视图是一张虚拟存在的表,以方便我们查询。
创建视图
如下的语句中,我们将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代码的简写。