SQL 视图
1 ) 概述
- 在mysql中,视图是一个非真实存在的虚拟表
- 其本质是,根据sql语句获取动态的数据集,并为其命名
- 用户使用时只需使用名称,即可获取结果集,并可以将其当做表来使用
2 )用法示例
2.1 比较麻烦的sql
sql
select
*
from
(select nid,name from tb1 where nid > 2) as A
where
A.name > 'alex'
2.2 使用视图简化以便后续可能得复用
- 上面子查询, 比较麻烦,可以考虑创建成视图
- 创建视图的示例
create view v1 as select nid,name from tb1 where nid > 2
- 使用视图
select * from v1;
- 上面这句sql的本质是
select * from (select nid,name from tb1 where nid > 2) as v1
- 删除视图
drop view v1;
- 修改视图
alter view v1 as sql语句
- 需要注意的是
- 基于视图只能查询, 不能执行增加,修改,删除
- 如果源表发生变化,视图表也会发生变化
- 注意:视图在开发阶段实际使用的频率不是很高
SQL触发器
1 ) 概述
- 比如,数据库中有两张表(或多张表),程序需要对某张表操作的时候
- 同时需要对另一张表进行增加,删除,修改等操作,在这时候就可以使用触发器
- 触发器是存储在数据库里,程序就不用操作另外一张表了,直接在操作目标表
- 另外的一张表的同步可以交给你写的触发器
- 可以在各个场景中使用
2 )用法示例
2.1 插入前,插入后
sql
-- 插入前
create trigger tri_before_insert_tb1 before insert on tb1 for each row
begin
-- ... 这里写你的逻辑
end
-- 插入后
create trigger tri_after_insert_tb1 after insert on tb1 for each row
begin
-- ... 这里写你的逻辑
end
2.2 删除前,删除后
sql
-- 删除前
create trigger tri_before_delete_tb1 before delete on tb1 for each row
begin
-- ... 这里写你的逻辑
end
-- 删除后
create trigger tri_after_delete_tb1 after delete on tb1 for each row
begin
-- ... 这里写你的逻辑
end
2.3 更新前,更新后
sql
-- 更新前
create trigger tri_before_update_tb1 before update on tb1 for each row
begin
-- ... 这里写你的逻辑
end
-- 更新后
create trigger tri_after_update_tb1 after update on tb1 for each row
begin
-- ... 这里写你的逻辑
end
- 触发器里的
FOR EACH ROW
是针对每一行的- 如果针对这张表每一行做操作,每一行都会触发一次触发器
- 比如,我有10行数据,在删除每一行的时候,都会触发这个触发器
- 删除触发器
drop trigger tri_after_insert_tb1;
这里删除定义的一个触发器
3 )综合示例
- 场景:你的数据库中有两张表分别是 t1 和 t2 需要触发器
- 需求和触发器
-
在 t1 表插入数据之前,先在 t2 表中插入一行数据
sqldelimiter $$ create trigger tri_before_insert_t1 before insert on t1 for each row begin if NEW.name = 'alex' then insert into t2(name) values(NEW.name); -- NEW 是新插入的数据 end if; end $$ delimiter;
-
在 t1 表中删除数据之后,再在t2表中插入一行数据
sqldelimiter $$ create trigger tri_after_insert_t1 after delete on t1 for each row begin if OLD.name = 'alex' then insert into t2(id, name) values(OLD.id, OLD.name); end if; end $$ delimiter;
-
这里,
NEW
是新数据,OLD
是原数据
-
- 触发器在业务开发中用的不多,这些一般程序都能搞定
- 习惯上,能用程序方便搞定的,不用数据库自带的触发器