视图
一、视图的概述
1. 含义:是从数据库中一个或多个表中导出的虚拟表
2. 作用:①简单化 ②安全性 ③逻辑数据独立性
3. 注意:一个表可以由多个视图;
二、视图的创建
1. 总的语法形式
- REPLACE:表示替换已经创建的视图
- ALGORITHM:表示视图选择的算法
- view_name :视图名
- column_list:属性列表
- select_statement:select语句
- WITH [CASCADED | LOCAL] CHECK OPTION:表示视图在更新时保证在视图的权限范围内
- CASCADED:默认值,表示更新视图时要满足所有相关的视图和表的条件
- LOCAL:表示更新视图时满足该视图本身定义的条件即可。
- UNDEFINED:表示MySQL自动选择算法
- MERGE:表示将使用视图语句与视图定义合并起来,使得视图定义的某一部分取代语句对应的部分 TEMPTABLE:表示将视图的结果存入临时表,然后用临时表来执行语句
2. 在单表上创建视图
语法:
CREATE VIEW 视图名 [(视图字段,……,字段n)] AS select 表字段名,……,表字段名n from 数据表;
CREATE or replace VIEW 视图名 [(视图字段,……,字段n)] AS select 表字段名,……,表字段名n from 数据表;
语句2,如果视图没有创建,则创建;如果视图已创建,则修改视图。
实例:
【例】
mysql>create view view_e(a,b,c,d,e,g,h) as select gkbh,yhm,mm,xm,xb,csrq,sfzh from guke;
【附,显示】
select * from view_e;
+-------+----------+----------+------+------+------------+--------------------+
| a | b | c | d | e | g | h |
+-------+----------+----------+------+------+------------+--------------------+
| 00001 | aaaaaaaa | 12345678 | 李明 | 男 | 1990-05-06 | 111111111111111111 |
| 00002 | bbbbbbbb | 12345678 | 李逵 | 男 | 1988-05-06 | 111111111111111111 |
| 00003 | cccccccc | 12345678 | 西施 | 女 | 1990-05-06 | 111111111111111111 |
+-------+----------+----------+------+------+------------+--------------------+![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)
(2) 注意:默认情况下创建的视图和基本表的字段是一样的,也可以通过指定视图字段的名称来创建视图。
3. 在多表上创建视图
语法:
CREATE VIEW 视图名 [(视图字段,……,字段n)]
AS A表表名.表字段名,……,A表表名.表字段名n,
B表表名.表字段名,……,B表表名.表字段名
from 数据A表,数据B表
where 连接条件;
实例:
【例】
mysql> create view view_a(订单编号,商品编号,顾客编号,订单日期)
as select dingdanxiangqing.ddbh,dingdanxiangqing.spbh,
dingdan.gkbh,dingdan.ddrq
from dingdan,dingdanxiangqing
where dingdanxiangqing.ddbh=dingdan.ddbh;
【附,效果】
mysql> select * from view_a;
+----------+----------+----------+---------------------+
| 订单编号 | 商品编号 | 顾客编号 | 订单日期 |
+----------+----------+----------+---------------------+
| 1 | 00000001 | 00001 | 2016-01-01 00:00:00 |
| 2 | 00000003 | 00003 | 2016-02-10 00:00:00 |
| 1 | 00000004 | 00001 | 2016-01-01 00:00:00 |
+----------+----------+----------+---------------------+![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)
三、视图的查看
语法:
desc 视图表
实例:
作用:显示视图的字段定义、字段的数据类型、是否为空、是否是主键外键、默认值和额外信息
语法
show table status like'视图表名’G;
实例
作用:显示视图的存储引擎,创建时间
语法
show create view 视图名
实例
作用:显示视图的名称和创建语句
语法
select * from information_schema.viewsG;
实例
mysql> select * from information_schema.viewsG;
*************************** 1. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: webshop
TABLE_NAME: view_a
VIEW_DEFINITION: select `webshop`.`dingdanxiangqing`.`ddbh` AS `订单编号`,`webshop`.`dingdanxiangqing`.`spbh` AS `商品编号`,`webshop`.`dingdan`.`gkbh` AS `顾客编号`,`webshop`.`dingdan`.`ddrq` AS `订单日期` from `webshop`.`dingdan` join `webshop`.`dingdanxiangqing` where (`webshop`.`dingdanxiangqing`.`ddbh` = `webshop`.`dingdan`.`ddbh`)
CHECK_OPTION: NONE
IS_UPDATABLE: YES
DEFINER: root@localhost
SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: gbk
COLLATION_CONNECTION: gbk_chinese_ci
作用:显示所有的数据表
四、视图的修改
①CREATE语句
总的语法
简化版
CREATE or replace view 视图名 as select 表字段 from 表名
注意:该语法与创建语法完全一样,当视图不存在时,此语法是创建视图;视图存在时,此语法是修改视图;
②ALTER语法
总的语法:
简化版:
ALTER view 视图名 as select 表字段 from 表名
五、视图的更新
注意:
①因为视图是虚拟表所以,所以对视图的操作,实际上是对基本表的操作;
②对其中的一个视图更新后,其基本表也更新了,从而与这个基本表相关的视图表的内容也更新。
③不可以更新的视图
1.包含以下关键字的sql语句:聚合函数(sum、min、max、count)、distinct、group by 、having、union 或者uinon all
2.常量视图
3.select 中包含子查询
4.join
5.from一个不可更新的试图
6.where字句的子查询引用了from字句中的表
(1)更新视图
语法:
update 视图名 set 更新数据;
注意:基本表已经改变
(2)插入记录
语法:
insert into 数据表名 values(插入的数据,……,插入的数据n);
六、视图的删除
1. 总的语法