MySQL技术内幕第4章 – 视图和存储程序

一、视图

1.视图的定义

(1)视图是一个虚拟表,实际上不包含数据。它是根据表或其他视图来进行定义的。查询视图就等效于查询定义它的那条语句,只是视图将细节隐藏起来了。通过它可以对底层表进行查询和修改。
(2)视图基于的表称为基表(底层表)。
(3)视图是存储在数据字典里的一条select语句。

2.视图的优点

(1)控制对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。
(2)用户通过简单的查询可以从复杂查询中得到结果。
(3)维护数据的独立性,视图可以从多个表中检索数据。
(4)对于相同的数据可产生不同的视图

3.创建视图
create view 视图名 as 查询语句;
4.查询视图
select * from 视图名;
5.修改视图
create or replace view 视图名称 as 子查询;
6.删除视图
drop view 视图名;
7.查看视图定义
desc 视图名称;

二、复合语句和语句分隔符

1.复合语句由一个BEGIN和END块构成,期间可以有任意数量的语句,内部可以有局部变量、条件语句、循环语句等等,复合语句内的语句之间必须要用“;”进行分隔。
2.delimiter命令用来重新定义mysql的默认分隔符。如:delimiter $

三、存储函数

1.创建存储函数

语法:

CREATE FUNCTION func_name([param_name type[,...]])
RETURNS type
[characteristic ...]
BEGIN
routine_body
END

参数说明

(1)func_name :存储函数的名称。
(2)param_name type:可选项,指定存储函数的参数。type参数用于指定存储函数的参数类型,该类型可以是MySQL数据库中所有支持的类型。
(3)RETURNS type:指定返回值的类型。
(4)characteristic:可选项,指定存储函数的特性。
(5)routine_body:SQL代码内容。

2.调用存储函数
SELECT func_name([parameter[,…]]);
3.修改存储函数
ALTER FUNCTION func_name ..... -- 其语法和创建存储函数一样。
4.删除存储函数
DROP FUNCTION [IF EXISTS] func_name;

四、存储过程

1.创建存储过程
CREATE PROCEDURE proc_name([[IN/OUT/INOUT] param_name type[,...]])
[characteristic ...]
BEGIN
routine_body
END
2.调用存储过程
CALL proc_name(...);
3.修改存储函数
ALTER PROCEDURE proc_name .... 其语法和创建存储函数一样。
4.删除存储函数
DROP PROCEDURE  proc_name;

五、存储函数和存储过程的区别

mysql视图replace_数据库

六、触发器

mysql视图replace_MySQL_02


MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行,执行触发器中定义的语句集合,满足触发条件时,由数据库自动调用执行,不需要手动调用。

1.创建触发器
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tb_name
FOR EACH ROW
BEGIN
trigger_body
END

参数含义

trigger_name:自定义触发器名称;
trigger_time:触发时机,取值为 BEFORE 或 AFTER;
trigger_event:触发事件,取值为 INSERT、UPDATE 或 DELETE;
tb_name:在哪张表上建立触发器;
trigger_body:触发器程序体。

2.new 与 old

INSERT 型触发器中,new用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
UPDATE 型触发器中,old用来表示将要或已经被修改的原数据,new用来表示将要或已经修改为的新数据;
DELETE 型触发器中,old用来表示将要或已经被删除的原数据;

3.删除触发器
drop trigger [if exists] trigger_name;

七、事件

1.开启和关闭事件功能

(也可以放在配置文件中,在服务器开启时自动开启或关闭事件功能)

查看:SHOW VARIABLES LIKE 'event_scheduler';
开启:SET GLOBAL event_scheduler = ON;   #或者1
关闭:SET GLOBAL event_scheduler = OFF;  #或者0
2.创建事件
CREATE EVENT event_name	 #event_name:自定义事件名称
ON SCHEDULE schedule   #schedule:定义事件执行时间
[ON COMPLETION [NOT] PRESERVE]	#(可选)事件执行完后是否保存,默认保存ON COMPLETION PRESERVE,执行完删除 ON COMPLETION NOT PRESERVE
[ENABLE | DISABLE | DISABLE ON SLAVE] #(可选)启用 | 禁用 | 如果是从服务器自动同步主上的创建事件的语句的话,会自动加上DISABLE ON SLAVE。
[COMMENT comment]		#(可选) comment: 事件注释(注释用引号引起来)
DO event_body;		# event_body:事件执行主体
3.事件执行事件举例
ON SCHEDULE AT CURRENT_TIMESTAMP	# 当前时间立刻执行
ON SCHEDULE EVERY 1 SECOND		#一秒执行一次(MINUTE/HOUR)
ON SCHEDULE EVERY 1 DAY		# 每天定时执行
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY	# 5天以后执行一次
ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY #5天后开启每天定时执行
ON SCHEDULE EVERY 1 DAY ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY	#5天后停止每天定时执行
ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH	#5天后开启每天定时执行,一个月后停止
4.激活或者禁用某个事件
ALTER EVENT event_name DISABLE;  -- 禁用
ALTER EVENT event_name ENABLE;   -- 激活