1. 视图
视图时一个虚拟表,不包含数据,在表或其它视图的基础上使用SELECT语句定义的,提供了另一种查看表数据的方式。
(1) 创建视图
基本语法
CREATE VIEW ViweName AS
SELECT……
(2) 使用视图
- 查询信息
SELECT * FROM ViewName [WHERE……] [GROUB BY] [ORDER BY] [LIMIT]
- 对表进行更新
2. 存储程序
存储函数:可用在表达式里返回某个计算的结果
存储过程:不会直接返回结果,但可以用来完成一般的运算或者生成可以传递会客户端的结果集
触发器:与表关联在一起,当表使用INSERT、DELETE或者UPDATE语句进行修改时,它会自动执行
事件:根据计划在预定的时刻自动执行
(1) 复合语句和语句分隔符
- 复合语句:由BEGIN和END块构成
-- 复合语句举例:显示一条信息,用你的名字向你问好
CREATE PROCEDURE greetings()
BEGIN
DECLARE user CHAR(77) CHARACTER SET utf8;
SET user = (SELECT CURRENT_USER());
IF INSTR(user,'@') > 0 THEN
SET user = SUBSTRING_INDEX(USER,'@',1);
END IF;
IF user = '' THEN
SET user='earthling';
END IF;
SELECT CONCAT('Greetings',user,'!') AS greeting;
END;
注意:使用存储程序时,需要用delimiter重新定义mysql的默认语句分隔符,负责会出错
(2) 存储函数和存储过程
存储函数常用与表达式中,会执行计算并返回一个值,类似CONCAT()这样的内建函数;存储过程是使用CALL语句来调用的独立操作,在只需通过运算来实现某种效果或动作,不需要返回值或者需要返回多个结果集时使用。
- 存储函数基本语法
-- 定义
CREATE FUNCTION FunctionName([ParamList])
RETURN Type
BEGIN
……
END;
-- 使用可以像使用内建函数那样调用
- 存储过程基本语法
-- 定义
CREATE PROCEDURE ProcedureName([ParamLists])
BEGIN
……
END;
--调用
CALL ProcedureName();
注意:存储函数不能对该函数的那条语句正在读取或者正写入的那个表进行修改,存储过程没有该限制
- 存储过程的参数类型
参数名 | 说明 |
---|---|
IN(默认) | 调用者传递给存储过程,存储过程可修改,存储过程的任何修改调用者不可见 |
OUT | 过程把某个值赋给这个参数,但返回该值后调用者可访问 |
INOUT | 允许调用者向过程传递一个值再取出一个值 |
-- 显示指定参数类型
CREATE PROCEDURE test(OUT t1,OUT t2)
BEGIN
END;
3. 触发器
触发器是与特定表相关联的存储过程,其定义会在执行表的INSERT、UPDATE 、DELETE语句时会自动激活。可在语句处理各行之前或之后激活。触发器的定义包含一条触发器在被激活时会执行的语句。
触发器的用途:
- 利用触发器来检查或修改将被插入或者更新行的新的数据值,实现数据完整性约束
- 触发器可为列提供默认值
基本语法
-- 定义
CREATE TRIGGER TriggerName
{BEFORE|AFTER}
{INSERT|UPDATE|DELETE}
ON TableName
FOR EACH ROW TriggerStmt; # TriggerStmt是触发器被激活时需要执行的语句,可使用OLD.ColName以及NEW.ColName来引用更改前后的行
举例
CREATE TABLE t(percent INT, dt DATETIME);
delimiter $
CREATE TRIGGER bi_t BEFORE INSERT ON t
FOR EACH ROW BEGIN
IF NEW.percent<0 THEN
SET NEW.percent=0;
ELSEIF NEW.percent>100 THEN
SET NEW.percent=100;
END IF;
END;
$
delimiter ;
INSERT INTO t (percent) VALUES(-2); DO SLEEP(2);
4. 事件
事件调度器会定时激活多个事件(数据操作),适合无人值守的系统任务管理
-- 查看事件调度器的状态
SHOW VARIABLES LIKE 'event_scheduler';
--设置事件调度器的状态
SET GLOBAL event_scheduler=OFF; --事件调度器停止,则所有事件都不会执行
SET GLOBAL event_scheduler=ON;
事件基本语法
-- 定义
CREATE EVENT EventName
ON SCHEDULE EVERY n interval [STARTS time] [ENDS time] # starts time和ends time用于指定事件第一次执行时间和最后一次执行时间
DO ……
-- 禁用某个事件或者重新激活某个事件
ALTER EVENT EventName DISABLE;
ALTER EVENT EventName ENABLE;