视图

视图:虚拟表(从一个或多个表/视图导出数据形成)

1)视图不含实际数据(数据仍在原表中),只存储视图本身的定义

2)表中数据发生变化,视图查询的数据也会随之改变

视图作用 说明
简化查询 抽取多表数据建立虚拟表,就可以操作像单表一样操作
保证安全 限制用户对数据库的访问范围
避免数据冗余 只使用SELECT语句,所有数据都保存在数据库表中
保证逻辑独立 可以使应用程序和数据库表在一定程度上独立
多角度查看数据 视图机制可使用户以不同方式查看同一数据

1)视图对用户而言,操作方法和对数据表的操作方法是一样的

2)DBMS(数据库管理系统)而言,对视图的操作最终都会转化为对表的操作

查看视图相关信息的指令如下:

1)列出当前数据库中所有的表和视图:SHOW TABLES;

2)列出创建视图时的MySQL语句:SHOW CREATE TABLE 视图名;

3)查看视图结构:DESC 视图名;

4)查看所有视图的详细信息:

SELECT *
FROM information_SCHEMA.views;

//MYSQL中所有视图定义存储在系统数据库information_schema的views表中

视图的规则如下:

1)视图的创建无数量限制,但命名需有唯一性;

2)视图可嵌套,其他视图可在视图的基础上再创建新视图;

3)视图不能被索引,也不能有关联的触发器或默认值;

4)视图可和表一起使用(如:子查询和连接查询等);

创建视图

视图创建格式:

CREATE  VIEW  视图名[视图字段列表]
AS
SELECT  (字段名1[,···,字段名N])
[WHERE  条件表达式]
[WITH  [LOCAL|CASCADED]  CHECK OPTION];

1)视图名称必须唯一,且不能与表/视图重名

2)AS不同于查询中的AS(设别名)

3)建议在视图名加前缀“VIEW_”或者后缀“_VIEW”以便管理

//在视图基础上建立视图,需给视图设置别名

//视图可以建立在表上或视图上,但表不能建立在视图上

如:利用视图查询cust_name为TNT2的cust_contact
 

(1)视图分为:检查视图普通视图(默认)
1)有WITH CHECK OPTION的为检查视图

2)检查视图更新数据时,需满足检查条件(视图定义中WHERE语句条件)

(2)检查视图分为:CASCADED视图(默认)和LOCAL视图
1)CASCADED视图更新数据时,数据需满足本身检查条件的同时还需满足其底层表/视图的所有检查条件,更新语句才能执行

2)LOCAL视图对更新数据时,数据只需满足该视图的检查条件的更新语句就能执行

管理视图

视图修改格式:

ALTER VIEW 视图名|视图字段列表
AS
SELECT (字段名1[,···,字段名N])
[WITH[LOCAL|CASCADED]CHECK OPTION];

1)视图的修改不同于表的修改(如:增加字段不能直接使用ADD)

视图删除格式:

DROP VIEW 视图名;

1)删除视图不会对表产生影响,不同于删除表(DROP TABLE 表名)

2)但需注意依赖关系(存在其他视图依赖删除的视图)

插入数据格式(和表完全相同):

INSERT  INTO  视图名(视图名1[,···,视图名N])
VALUES (数据1 [,···,数据N]);

更新数据格式(和表完全相同):

UPDATE  视图名
SET  视图名1=值1  [,···,字段名N=值N]
WHERE 条件表达式;

删除数据格式(和表完全相同):

DELETE  FROM  视图名
WHERE 条件表达式;

1)视图为虚拟表,但视图的数据更新最终会转化为对表的更新(更改原表数据)

2)部分视图是不可更新的,因为不能唯一地有意义的转换成对应的表的更新

3)不能同时修改来自两个或多个表的视图数据;

4)若更新检查视图(含WITH CHECK OPTION选项),则

进行更新的数据需满足原查询条件(子查询中的条件表达式)

视图定义中有以下情况不能进行数据的更新
FROM子句中包含多个表或者UNION运算符
指定了WITH CHECK OPTION,修改数据不满足视图定义的范围
SELECT语句包含聚合函数、列的运算、GROUP BY子句、DISTINCT选项
UPDATE、DELETE执行前提条件: 数据必须在视图的结果集中(查询后包含该数据)

使用视图

视图检索数据格式(和表完全相同):

SELECT  [ALL|DISTINCT]  字段名 
FROM  视图
[WHERE 条件表达式]
[GROUP BY 字段名|位置 [ASC|DESC] [HAVING 条件表达式]]
[ORDER BY 字段名|表达式|位置[ASC|DESC]]
[LIMIT  M[,N]];

如:利用视图查询cust_id为10003的cust_id和cust_email