视图
视图:虚拟表(从一个或多个表/视图导出数据形成)
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