视图
-
介绍
视图(View) 是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成。
通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在这条SQL语句查询上
视图的增删改查
-
创建
-
语法 (被[]括起来表示可省略)
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [WITH [CASCADED |LOCAL] CHECK OPTION]
-
案例
CREATE OR REPLACE VIEW v2 (id,salary) AS SELECT employee_id,salary FROM employees LIMIT 10;
-
-
修改
-
语法
ALTER VIEW 视图名称[(列名列表)] AS SELECT语句 [WITH[CASCADED |LOCAL] CHECK OPTION]
-
-
删除
-
语法
DROP VIEW [IF EXISTS] 视图名称 [,视图名称]......
-
视图的检查选项
当创建视图时,如果没有加上检查选项,即 with [CASCADED | LOCAL] check option,那么对视图进行增删改查操作时,就不会检查这些操作是否违背了视图创建时的定义
-
事例1
视图的创建 (创建视图v1,条件为employees表中薪资大于等于8000的人)
CREATE OR REPLACE VIEW v1 AS SELECT * FROM employees WHERE salary >=8000;
往v1中添加数据
inster into v1 values(1,5000)
会发现这条插入语句能执行成功,这显然违背了视图v1创建时的定义 where salary >= 8000,但是视图v1并不会真正的把这条数据插入到视图v1中
-
事例2
创建视图 v1 ,并带上检查选项
CREATE OR REPLACE VIEW v1 AS SELECT * FROM employees WHERE salary >=8000 with check option;
往v1中添加数据
inster into v1 values(1,5000);
会发现这条语句会执行失败,应为当创建视图并指定检查选项,那么对视图进行插入或修改操作时,如果违背了视图创建时的定义,则sql语句会执行失败。
CASCADED 和 LOCAL
CASCADED
当创建视图并添加检查选项时,检查选项默认时 CASCADED 的
视图不仅可以依赖表创建,也可以依赖其他视图创建,当视图是依赖其他视图创建时,往子视图添加或修改数据时会依次往上判断是否满足检查选项(无论上层视图是否有 with check option)
-
创建视图
create view v1 as select id,salary from employees where salary < 15000; create view v2 as select id,salary from employees where salary >10000; create view v3 as select id,salary from employees where id < 50 with cascaded check option; create view v4 as select id,salary from employees where id >= 10 and salary < 14000;
执行插入语句
#插入第一条数据,满足所有条件 mysql> insert into v4 values(12,12000); Query OK, 1 row affected (0.00 sec) #插入第二条数据,不满足v4,其他都满足 mysql> insert into v4 values(1,12000); Query OK, 1 row affected (0.00 sec) #插入第三条数据,不满足v3 mysql> insert into v4 values(50,12000); ERROR 1369 (HY000): CHECK OPTION failed 'surpass.v4' #插入第四条数据,满足v3,不满足v2。 mysql> insert into v4 values(10,9000); ERROR 1369 (HY000): CHECK OPTION failed 'surpass.v4' #插入第五条数据,满足v3、v2,不满足v1 mysql> insert into v4 values(20,20000); ERROR 1369 (HY000): CHECK OPTION failed 'surpass.v4'
LOCAL
与CASCADED 的区别在于,依次往上的过程中,如果有视图在创建时没有添加 with [cascaded | local] check option 则不去判断是否满足检查选择