视图:视图是由查询结果形成的一张虚拟表 ,并不是我们自行创建的表,而是将一个频繁的查询结果当成一张临时表来用。
语法:create view as select 语句
为什么要有视图?
1、可以简化查询
2、可以进行权限控制
把表的权限封闭,但是开发相应的视图权限,视图里只开放部分数据
3、大数据分表时可以用到
拆表
视图与表的关系:
视图是表的查询结果,自然表的数据改变了,影响视图的结果
视图必须包含表中没有默认值也不能为空的列
触发器:trigger 一触即发
作用:监视某种情况并触发某种操作
四要素:监视地点 监视事件 触发时间 触发事件
语法:
create trigger 触发器名
触发时间 触发事件 on 监视地点
for each row(固定写法)
begin
表数据的操作语句,
end;
因为sql语句默认是以;结尾,所以在使用触发器的时候需要将结束符修改一下
修改结束符的语句:delimiter $ (设置$为结束符)
触发事件:after before
区别:after是先完成数据的增删改再触发,触发的语句晚于监视的增删改们无法影响前面的增删改动作
before是先完成触发,再增删改,触发的语句先于增删改发生,我们有机会判断,修改即将发生的操作。
案例:# 视图
# 语法:create view 视图名 as select 语句;
CREATE TABLE person(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME CHAR(10),
age INT
);
INSERT INTO person(NAME,age) VALUES('张三',12),('李四',13),('王五',23),('马六',24);
CREATE VIEW view1 AS SELECT NAME FROM person;
-- 原表发生改变,视图会不会发生改变
INSERT INTO person(NAME,age) VALUES ('xm',22);
-- 视图发生改变 ,原表会不会发生改变
DELETE FROM view1 WHERE NAME='xm';
CREATE TABLE g(
id INT,
NAME VARCHAR(10),
num INT
)CHARSET utf8;
CREATE TABLE o(
oid INT,
gid INT,
much INT
)CHARSET utf8;
INSERT INTO g VALUES(1,'猪',22),
(2,'羊',19),(3,'狗',12),(4,'猫',8);
#1.添加订单,库存减少
-- 创建一个触发器
DELIMITER $
CREATE TRIGGER tg1
AFTER INSERT ON o
FOR EACH ROW
BEGIN
UPDATE g SET num = num - new.much WHERE id=new.gid;
END$
-- 添加订单
INSERT INTO o VALUES(2,3,3);
-- 删除订单库存增加
DELIMITER $
CREATE TRIGGER tg2
AFTER DELETE ON o
FOR EACH ROW
BEGIN
UPDATE g SET num = num + old.much WHERE id=old.gid;
END$
DELETE FROM o WHERE oid=2;
-- 修改订单的数量时,库存相应改变
DELIMITER $
CREATE TRIGGER tg3
AFTER UPDATE ON o
FOR EACH ROW
BEGIN
UPDATE g SET num=num+old.much-new.much WHERE id=old.gid;
END$
UPDATE o SET much=1 WHERE oid=1;
-- 强制把订单的商品数量改成5
DELIMITER $
CREATE TRIGGER tg4
BEFORE INSERT ON o
FOR EACH ROW
BEGIN
IF new.much>5 THEN
SET new.much=5;
END IF;
UPDATE g SET num=num-new.much WHERE id=new.gid;
END$
-- 添加订单
INSERT INTO o VALUES(1,1,10);