文章目录
一、题目
针对actor表创建视图actor_name_view,只包含first_name以及last_name两列,并对这两列重新命名,first_name为first_name_v,last_name修改为last_name_v:
二、视图相关操作
1.创建视图
CREATE VIEW view_name
AS
查看创建视图的语句
SHOW CREATE VIEW viewname
create view actor_name_view (first_name_v,last_name_v)
as
select first_name ,last_name
from actor
或
CREATE VIEW actor_name_view
AS
SELECT first_name first_name_v,last_name last_name_v
FROM actor
2.更新视图
(1)更新一个视图,将更新其表,如果对视图增加或删除行,实际上是对其基表增加或删除行
(2)如果视图定义中有如下操作,则不允许被更新
① 分组(Group by)
② 连结
③ 子查询
④ 并
⑤ 聚集函数(Min,Max,Count)
⑥ DISTINCT
⑦ 导出(计算)列
(3)视图主要用于检索
代码如下(示例):
更新时:
(1) 可以先drop,再create
(2) CREATE ORREPLACE VIEW
如果要更新的视图存在,替换原视图
不存在,创建一个视图
3.删除视图
DROP VIEW viewname;
三、SQL41 构造一个触发器audit_log
1.触发器
MySQL响应DELETE、INSERT、UPDATE语句时自动执行的一组语句
2.创建
创建时:
① 唯一的触发器名(表中唯一,数据库中不一致)
② 触发器关联的表
③ 触发器应响应的活动 DELETE、INSERT、UPDATE
④ 触发器何时执行(处理之前或之后)
CREATE TRIGGER <触发器名>
< BEFORE | AFTER >
<INSERT | UPDATE | DELETE > #激活语句
ON <表名> FOR
BEGIN
EACH Row<触发器主体>; #触发器激活时将要执行的 MySQL 语句
END;
# 触发器主体如果是多条语句,可以使用BEGIN END 标记
# 一般是指行级触发,对于受触发事件影响的每一行都要激活触发器的动作。
只有表才支持触发器,视图(临时表)不支持
3.删除
DROP TRIGGER 触发器名
4. INSERT 触发器
(1)在INSERT 触发器中,可引入一个名为NEW的虚拟表,访问被插入的行
(2)在BEFORE INSERT触发器中,NEW的值可以被更新
(3)对于AUTO_INCREMENT列,NEW在INSERT执行前包含0,在INSERT执行后包含新的自动生成值
CREATE TRIGGER neworder
AFTER INSERT ON orders
FOR EACH ROW
SELECT NEW.order_num;
#通过NEW获得触发事件,触发器从NEW.order_num取得相应的值并返回
执行插入语句时,自动返回新的订单号
4.DELETE 触发器
(1)在DELETE 触发器中,可引入一个名为OLD的虚拟表,访问被删除的行
(2)OLD的值全是可读的,不能被更新
如果因为某种原因,订单不能存档,DELETE 本身将被放弃
5.UPDATE 触发器
(1)在UPDATE 触发器中,可引入一个名为OLD的虚拟表,访问以前(UPDATE语句)前的值,引用一个名为NEW的虚拟表访问新更新的值
(2)NEW值可能被更新(允许更改将要用于UPDATE语句中的值)
(3)OLD的值全是可读的,不能被更新
CREATE TRIGGER updatevendor
BEFORE UPDATE ON vendors
FOR EACH ROW
SET NEW.vend_state=UPPer(NEW.vend_sate)
#每次更新一行 NEW.vend_state中的值都用 UPPer(NEW.vend_sate)代替
具体代码如下:
CREATE TRIGGER audit_log
AFTER INSERT ON employees_test
FOR EACH ROW
BEGIN
INSERT INTO audit VALUES(NEW.ID,NEW.NAME);
END;