1、视图作用
关系型数据库中的数据是由一张一张的二维关系表所组成,简单的单表查询只需要遍历一个表,而复杂的多表查询需要将多个表连接起来进行查询任务。对于复杂的查询事件,每次查询都需要编写MySQL代码效率低下。为了解决这个问题,数据库提供了视图(view)功能。(采用moxigandashu关于视图的理解)
2、关于视图的理解
实际使用时,视图其实和表没多大的差别。把视图当作表的概念来创建以及使用。但是切记视图不是表,是”虚拟表”,不保存数据!关于视图打个比方,大家在工作中使用电脑时,在磁盘中通过一层层的路径找到自己想要的文件时,很麻烦。现在视图相当于在你工作前,你找到文件不关掉弹框,下次查看文件内容时直接点击弹框就行了,很方便很快捷。
3、 视图相关的MySQL指令
操作指令 | 代码 |
---|---|
创建视图 | CREATE VIEW 视图名(列1,列2...) AS SELECT (列1,列2...) FROM ...; |
使用视图 | 当成表使用就好 |
修改视图 | CREATE OR REPLACE VIEW 视图名 AS SELECT [...] FROM [...]; |
查看数据库已有视图 | >SHOW TABLES [like...]; (可以使用模糊查找) |
查看视图详情 | DESC 视图名 或者SHOW FIELDS FROM 视图名 |
视图条件限制 | [WITH CHECK OPTION] |
4、视图的创建
需求:由txn_so_wp_mstr表中取出team_id,team_name,bpc_finish_time
create view view_test(team_id,team_name,bpc_finish_time) as
select team_id,team_name,bpc_finish_time
from txn_so_wp_mstr;
注意:视图创建不支持子查询!如下:
create view workteam_capacity_kpi(work_team_id,work_team_name,car_cnt,plate_cnt,dim_dt) as
select
plate.work_team_id AS work_team_id
,plate.work_team_name AS work_team_name
,car.car_cnt AS car_cnt
,plate.plate_cnt AS plate_cnt
,plate.dim_dt2 AS dim_dt
from
(
select
count(*) AS car_cnt
,team_id
,team_name
,substr(bpc_finish_time,1,7) AS dim_dt1
from txn_so_wp_mstr
where bu_id = 'buid'
and bpc_check_result = '915f21a8-5cc0-46e5-bd25-54cb2e1bd0b1'
group by team_id,team_name,dim_dt1
)car
right join
(
select
count(dis.process_id) AS plate_cnt
,dis.work_team_id
,dis.work_team_name
,substr(dis.work_end_time,1,7) AS dim_dt2
from txn_so_wp_dispatch dis
left join mdm_bu_mstr bu
on dis.create_org_no = bu.bu_no
where bu.id = 'buid'
and dis.status = '完工'
and dis.is_quality_check = '1'
)plate
on car.team_id = plate.work_team_id and car.dim_dt1 = plate.dim_dt2
order by plate.dim_dt2
报错信息:1349 - View's SELECT contains a subquery in the FROM clause
5、 通过视图变更数据
(1)可以通过视图插入数据,但是只能基于一个基础表进行插入,不能跨表更新数据。
比如,一个视图view1,数据由A、B、C三张表获取。在你insert into view1时,只能一次性的操作一张表的数据。
(2)注:如果在创建视图的时候制定了“WITH CHECK OPTION”,那么更新数据时不能插入或更新不符合视图限制条件的记录。
如下:创建了限制条件bu_id = 'build'的视图
create view view_test(team_id,team_name,bpc_finish_time) as
select team_id,team_name,bpc_finish_time
from txn_so_wp_mstr
where bu_id = 'buid'
with check option;
那么当insert into view_test 时不满足条件(bu_id = 'build')时,会报错。
(3)在不加“WITH CHECK OPTION”的情况下,通过视图修改记录,可以成功执行,但是会导致数据无辜丢失,因此创建视图时建议加上“WITH CHECK OPTION”命令。
6、总结:
- 视图可以看做表来用,但不是表,无法存储数据,是‘虚拟’的;
- 创建视图时不能有子查询,会报错;
-
创建视图时建议在结尾加上:WITH CHECK OPTION,一般和where子句一起使用;
-
对于视图进行更新数据时只能一次性的对一个数据源表操作,否则报错。
----多处采用moxigandashu的博文。如有错误请提醒,持续更新,转载请声明