存储过程,触发器,视图
一、MySQL存储过程
1.1 概念
存储过程是由过程化SQL语句书写的过程,这个过程经过编译和优化后存储在数据库服务器中,因此称它为存储过程,使用时只需要调用即可。
1.2 优点
- 运行效率高,因为使⽤存储过程⽐使⽤单独的SQL语句要快。(预先编译)
- 降低客户机与服务器之间的通信量
- 可以把⼀些复杂的sql进⾏封装,简化复杂操作,保证了数据的完整性,防⽌错误
- 存储过程在开发的时候比较有用,比如执行大量操作之后可以使用存储过程来把数据库调整到修改之前的状态
1.3 缺点
- 存储过程的编写⽐SQL语句复杂
- ⼀般可能还没有创建存储过程的权限,只能调⽤
1.4 使用存储过程
1.4.1 创建存储过程
CREATE OR REPLACE PROCEDURE 过程名([参数 1, 参数 2, ...]) /*存储过程部首*/
AS<过程化 SQL块>; /*存储过程体,描述存储过程的操作*/
\d //
修改MySQL默认的语句结尾符 ;
,改为 //
。
create procedure
创建语句 BEGIN
和END
语句⽤来限定存储过程体
栗子:
-- 定义存储过程
\d //
create procedure p1()
begin
set @i=10;
while @i<90 do
insert into users values(null,concat('user:',@i),@i,0);
set @i=@i+1;
end while;
end;
//
1.4.2 执行存储过程
CALL/PERFORM PROCEDURE 过程名([参数 1, 参数 2, ...])
使用 CALL
或者 PERFORM
等方式激活存储过程的执行。在过程化SQL中,数据库服务器支持在过程体中调用其他存储过程
栗子:
call p1();
1.4.3 查看存储过程
show create procedure p1\G;
1.4.4 修改存储过程
-
重命名
ALTER PROCEDURE 过程名1 RENAME TO 过程名2;
-
重编译
ALTER PROCEDURE 过程名 COMPILE;
1.4.5 删除存储过程
DROP PROCEDURE 过程名();
栗子:
drop procedure p1;
1.5 理解
就像一个函数一样,提前定义好,需要用的时候就调用,还可以传递参数
二、MySQL触发器
2.1 定义
触发器(trigger)是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,触发器将被保存在数据库服务器中
理解:提前定义好⼀个或⼀组操作,在指定的SQL操作前或后来触发指定的SQL⾃动执⾏
2.2 语法
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
说明:
-- trigger_name:触发器名称
-- trigger_time:触发时间,可取值:BEFORE或AFTER
-- trigger_event:触发事件,可取值:INSERT、UPDATE或DELETE。
-- tb1_name:指定在哪个表上
-- trigger_stmt:触发处理SQL语句。
-- 查看所有的 触发器
show triggers\G;
-- 删除触发器
DROP trigger trigger_name;
2.3 理解
触发器也可以实现一些表的级联更新和删除操作
三、视图
3.1 视图概念
视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放使徒的定义,不存放视图对应的数据,这些数据仍然存在于原来的基本表中。一旦基本表数据改变们视图数据也随之改变。
3.2 视图的作用
- 重⽤SQL语句。
- 简化复杂的SQL操作。在编写查询后,可以⽅便地重⽤它⽽不必知道它的基本查询细节。
- 使⽤表的组成部分⽽不是整个表。
- 保护数据。可以给⽤户授予表的特定部分的访问权限⽽不是整个表的访问权限。
- 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
- 注意:视图不能索引,也不能有关联的触发器或默认值。
3.3 基本语法
--创建视图:
create view v_users as select id,name,age from users where age >= 25 and age <= 35;
--view视图的帮助信息:
? view
ALTER VIEW
CREATE VIEW
DROP VIEW
--查看当前库中所有的视图
show tables; --可以查看到所有的表和视图
show table status where comment='view'; --只查看当前库中的所有视图
--删除视图v_t1:
drop view v_t1;
3.4 理解
试图就是一个临时表,存在的意义就是方便查询,所见即所需
“用户”只能查询或者修改视图中的数据,某些情况下比较安全