视图,触发器,存储过程
注意:视图,触发器,存储过程都是在数据库中的
视图
概念
保存的 引用其他表数据的临时表
对临时表数据进行的修改会影响原表数据
作用
屏蔽某些字段
封装复杂语句
使用
创建视图 create view 视图名 as 查询语句
会根据查询结果来创建视图表,可以像查询普通一样来查询视图表
使用视图 select * from 视图名 where 条件
改变视图 alter view 视图名 as 查询语句
重新创建了视图表,来更新字段
删除视图
drop view 视图名
触发器-trigger
作用
监听某种情况,并触发某种操作
触发器创建语法四要素:1.监听地点(table)
2.监视事件(insert/update/delete) # 监听对表的操作
3.触发时间(之前after/之后before)
4.触发事件(insert/update/delete) # 进行某些操作
创建触发器语法
create trigger 触发器名 after/before insert/update/delete on 表名 for each row -- 这句话是固定的 begin -- 需要执行的sql语句,一定要带引号 end -- /只能选一个
创建两张表,一张商品表,一张订单表,当订单表里产生数据是,商品表应该有对应的变化
#商品表 create table goods( id int primary key auto_increment, name varchar(20), num int ); |
#订单表 create table order_table( oid int primary key auto_increment, gid int, much int ); |
添加3条商品数据
insert into goods(name,num) values('商品1',10),('商品2',10),('商品3',10); -- 商品名和数量
当没有使用触发器时,当订单表里产生数据时,需要手动去更新商品数量,麻烦
使用触发器
create trigger tg3 after delete on order_table for each row -- 监测order_table表的删除 begin update goods set num = num + old.much where id = old.gid; -- 当order_table表有插入信息时,修改goods表对应数据 end
我不买了,我要撤销订单
create trigger tg3 after delete on order_table for each row -- 监测order_table表的删除 begin update goods set num = num + old.much where id = old.gid; -- 当order_table表有插入信息时,修改goods表对应数据 end
修改订单
create trigger tg4 after update on order_table for each ROW -- 监测order_table表的修改操作 BEGIN update goods set num = num + old.much where id = old.gid; update goods set num = num-new.much where id = new.gid; -- update goods set num = num+old.much-new.much where id = new.gid; -- 当order_table表有修改信息时,还原再修改 END
触发时间
之前操作after 是在检测到操作后先进性触发器里的操作
之后操作before 是在检测到操作后先进性检测到的操作,然后进行触发器里的操作
old 和 new
old是检测到数据的原数据,old.字段名 是这个字段修改之前的值
new是检测到数据的新数据(发生变化后的数据),new.字段名 是这个字段修改之后的值
删除触发器 drop view 触发器名;
存储过程
MySQL数据库在5.0版本后开始支持存储过程,那么什么是存储过程呢?怎么创建、查看和删除存储过程呢?存储过程有什么优点?
1.概念:什么是存储过程:类似于函数(方法),简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集合,该语句集包括SQL语句(对数据的增删改查)、条件语句和循环语句等。
查看现有的存储过程
show procedure status;
删除存储过程
drop procedure 存储过程名;
调用存储过程
call 存储过程名(参数,)
创建存储过程-没有修改 ,删了重写
循环及判断
-- 简单的存储过程 create procedure 名字 () begin sql语句 end -- 调用方法 call 名字() -- 带参数 create procedure 名字 (in/out/inout 形参名 类型(长度),in) begin sql语句 end -- 调用方法 call 名字(实参) -- 存储过程中没有return ,out表示返回参数(出参),in(入参) -- 设置在存储过程中为出参赋值,set 出参 = n -- 在存储过程执行结束后出参会发生变化 -- 控制语句 create procedure 名() begin if 条件 then -- 一定要有then sql语句; -- 一定要有分号 elseif 条件 then sql语句; else sql语句 end if; -- 一定要有这一句 end -- 循环语句 create procedure 名() begin declare 变量名 类型 default 值; -- 设置变量 declare是存储过程中特有的 -- 另一种设置默认值的方式,变量在全部声明完后才可以赋值 -- declare 名 类型;-- 声明变量 -- set 名= 值; -- 设置值 while 条件 do -- 开始循环 循环代码 end while; end -- 实参 设置实参 set @名=值 -- @是自定义变量,@@是系统定义变量,不加是局部变量 -- 这里必须加 call 存储过程名(@名)
存储过程优点:
1、存储过程增强了SQL语言灵活性。存储过程可以使用控制语句编写,可以完成复杂的判断和较复杂的运算,有很强的灵活性;
2、减少网络流量,降低了网络负载。存储过程在数据库服务器端创建成功后,只需要调用该存储过程即可,而传统的做法是每次都将大量的SQL语句通过网络发送至数据库服务器端然后再执行;
3、存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
4、系统管理员通过设定某一存储过程的权限实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。