数据库中的视图是一个虚拟表. 同真实表一样, 包含行和列数据, 行和列的数据来自 定义视图查询所引用的表, 并且在引用视图时动态生成. 可以隔离用户与数据保持安全, 且快速查询数据.
Mysql5.0 后版本支持视图, 可以使用 select,insert into,update,delete 等. 无论修改基本表还是视图都对应发生变化.
视图的作用:
比直接从数据表中读取相比:
1, 简化了: 看到的就是需要的.
2, 安全性: 通过视图用户只能查询和修改他们所能看到的数据. 其他数据看不到也取不到.
3, 逻辑数据独立性: 视图可以帮助用户屏蔽真实表结构变化带来的影响.
创建视图:
视图包含了 select 查询的结果, 因此视图的创建基于 select 语句和已存在的数据表, 视图可以建立在一张表上, 也可以建立在多张表上.
语法:
- create [or replace] [algorithm = {undefined | merge | temptable }]
- view view_name [(column_list)]
- as select_statment
- [with [cascaded | local] check option]
- create # 创建视图
- replace # 替换视图
- algorithm # 视图算法: undefined 系统自己选择算法; merge 表示视图语句与视图定义合并, 使视图定义部分替代语句对应部分; temptable 表示将视图结果存入临时表, 用临时表来执行语句.
- view_name # 视图名称
- column_list # 属性列
- select_statment # select 语句
- [with [cascaded | local] check option] # 表示权限范围之内: cascaded 表示满足所有条件. local 表示更新时满足视图本身条件即可.
单表创建视图:
- mysql> create database view;
- mysql> use view;
- mysql> create table t (quantity INT,price INT);
- mysql> insert into t values(3,50);
- mysql> create view view_t as select quantity,price,quantity * price from t;
- mysql> select * from view_t;
- # 默认情况下创建的视图和基本表的字段一样, 也可以通过指定视图字段的名称来创建视图.
- mysql> create view view_t2(qty,price,total) as select quantity,price,quantity * price from t;
- mysql> select * from view_t2;
- # view_t 和 view_t2 两个视图中的字段名称不同, 但是数据却是相同的. 因此在使用视图的时候, 可能用户根本就不需要了解表的机构, 更接触不到实际表中的数据, 从而保证了数据库的安全.
在多表上创建视图:
- mysql> create database stud;
- mysql> use stud;
- mysql> create table student (id int,name char(20));
- mysql> create table stu_info (id int,name char(20),addr char(20));
- mysql> show tables;
- mysql> insert into student values(1,'zhouyi'),(2,'zhaoer'),(3,'zhangsan');
- mysql> insert into student values(1,'zhouyi','beijing'),(2,'zhaoer','shanghai'),(3,'zhangsan','chengdu');
- mysql> select * from stu_info;
- mysql> select * from student;
- mysql> create view stu_glass(id,name,glass) as select student.id,student.name,stu_info.addr from student,stu_info where student.id=stu_info.id;
- mysql> select * from stu_glass;
- # 可以看出视图 id 是 student.id
- # name 是 student.name
- # glass 是 stu_info.addr
查看视图:
- mysql> show table status like 'stu_glass'\G; # 全是 NULL,Comment: VIEW 表示虚表
- mysql> desc stu_glass; # 查看视图基本信息
- mysql> show create view stu_glass\G; # 查看视图创建信息
- mysql> select * from information_schema.views\G; # 查看详细信息
修改视图:
- mysql> use view;
- mysql> desc view_t;
- mysql> alter view view_t as select quantity from t;
或者:
- mysql> create or replace view view_t as select * from t;
- mysql> desc view_t;
更新视图:
- mysql> alter view view_t as select quantity from t; # 修改视图和元数据不同
- mysql> select * from view_t;
- mysql> select * from t;
- mysql> update view_t set quantity=5;
- mysql> select * from view_t;
- mysql> select * from view_t2;
- mysql> select * from t;
- # 全部更新
插入数据:
- mysql> insert into t values (3,5); # 插入数据
- mysql> select * from view_t;
- mysql> select * from view_t2;
- mysql> select * from t; # 全部插入
- mysql> delete from view_t2 where price=5; # 删除 view_t2 视图中 price=5 的数据;
- mysql> select * from view_t2;
- mysql> select * from t;
- # 在 view_t2 中删除 price=5 的操作最终是通过基本表中的相关记录实现的.
注意:
当视图中包含有如下内容时, 视图的更新操作将不被执行:
1, 视图中不包含基本表中被定义为非空的列;
2, 在定义视图的 select 语句后的字段列表中使用数学表达式;
3, 在定义视图的 select 语句后的字段列表中使用了聚合函数;
4, 在定义视图的 select 语句中使用了 distinct,union,top,group,having 子句.
删除视图:
- mysql> drop view if exists view_t2;
- mysql> show create view view_t2;
- ERROR 1146 (42S02): Table 'view.view_t2' doesn't exist
来源: http://www.bubuko.com/infodetail-2718147.html