SQL语句(二)——视图与触发器

视图(VIEW)

视图是一种虚拟的表,是从数据库一个或多个表中导出来的表。
数据库中只存放了视图的定义,并没有存放视图中的数据,这些数据存放在原来的表中。
使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。

视图的作用

使操作更加简便化;增加数据的安全性;提高表的逻辑独立性。

创建视图

1
2
3
4
CREATE [ALGORITHM = {UNDEFINED|MERGE|TAMPTABLE}]
VIEW 视图名 [(属性清单)]
AS SELECT 语句
[WITH [CASCARDED|LOCAL] CHECK OPTION];

其中
ALGORITHM是可选参数,表示视图选择的算法。
UNDEFINED表示将自动选择需要的算法,一般就使用默认的;MERGE表示将使用视图的语句与视图定义合并气啦,使得视图定义的某一部分取代语句的对应部分;TEMPTABLE表示将视图的结果存入临时表,然后使用临时表执行语句。
CASCADED表示更新视图时要满足所有相关视图和表的条件,该参数为默认值;LOCAL表示更新视图时,要满足该视图本身的定义条件即可。 //cascaded级联的
1) 在单表上创建视图
CREATE VIEW v1 AS SELECT * FROM t_book;
2) 在多表上创建
CREATE VIEW v2 AS SELECT bookName, bookTypeName FROM t_book, t_bookType
WHERE t_book.bookTypeId = t_bookType.id;

查看视图

1) DESCRIBE(简写DESC):查看视图基本信息
DESC v1;
2) SHOW TABLE STATUS:查看视图基本信息
SHOW TABLE STATUS LIKE ‘v1’;
3) SHOW CREATE VIEW:查看视图详细信息
4) 在系统views表中查看视图详细信息
数据库information_schema -> Tables -> VIEWS表 //schema模式

修改视图(的定义)

1) CREATE OR REPLACE语句创建或修改视图

1
2
3
4
CREATE OR REPLACE [ALGORITHM = {UNDEFINED|MERGE|TEMPTABLE}]
VIEW 视图名 [(属性清单)]
AS SELECT 语句
[WITH [CASCADED|LOCAL] CHECK OPTION];

2) ALTER语句修改视图

1
2
3
4
ALTER [ALGORITHM = {UNDEFINED|MERGE|TEMPTABLE}]
VIEW 视图名 [(属性清单)]
AS SELECT 语句
[WITH [CASCADED|LOCAL] CHECK OPTION];

更新视图

更新视图即通过视图来插入(INSERT)、更新(UPDATE)、删除(DELETE)表中的数据。但由于视图是一个虚拟表,其中没有数据,因此通过视图更新表时,都是转换基本表来更新。更新视图时,只能更新权限范围内的数据;超出范围的数据则不能更新。
将视图当做表来操作
INSET INTO v1 VALUES (NULL, ‘shuxue’, ‘120’);

删除视图

删除视图的定义,并不会删除表。
DROP VIEW [IF EXISTS] 视图名列表 [RESTRICT|CASCADE]; //restrict约束,cascade级联
DROP VIEW IF EXISTS v2;

触发器(TRIGGER)

触发器是用事件来触发某个操作,这些事件包括INSERT、UPDATE、DELETE语句。
比如在A表中插入一条信息,则在B表中也插入一条数据。

创建与使用触发器

1
2
3
4
5
6
7
8
9
10
1)	创建只有一个执行语句的触发器

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW 执行语句;
//在t_book中增加一条信息,相应的bookName数加1
CREATE TRIGGER trig_book AFTER INSERT
ON t_book FOR EACH ROW
UPDATE t_bookType SET bookNum = bookNum +1 WHERE new.bookTypeId = t_bookType.id;
其中new为过渡变量,为刚才发生插入操作的事件的表;old为发生删除操作事件的表。
INSERT INTO t_book VALUES(NULL, ‘JAVA’, ‘张三’, ’30’, ‘4’);

2) 创建有多个执行语句的触发器

1
2
3
4
5
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGINE
执行语句列表
END;

查看触发器

1) SHOW TRIGGERS;//会列出所有的触发器
2) 在triggers表中查看触发器信息

删除触发器

DROP TRIGGER 触发器名;