MySQL:12_视图

视图

  • 跟事务里讲的视图没有任何关系

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。

一.基本使用

  • 创建视图
mysql 复制代码
create view 视图名 as select语句;
  • 案例
mysql 复制代码
create view v_ename_dname as select ename, dname
from EMP, DEPT where EMP.deptno=DEPT.deptno;
  • 修改了视图,对基表数据有影响
mysql 复制代码
select emp.ename,dept.dname,dept.deptno from emp,dept where
emp.deptno=dept.deptno order by dname;
update v_ename_dname set ename='TEST' where ename='CLARK';
select * from EMP where ename='CLARK';
select * from EMP where ename='TEST';
  • 修改了基表,对视图有影响
  • 删除视图
mysql 复制代码
drop view 视图名;

二.视图规则和限制

视图建议以查为主

  • 与表一样,必须唯一命名(不能出现同名视图或表名)
  • 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
  • 视图不能添加索引,也不能有关联的触发器或者默认值
  • 视图可以提高安全性,必须具有足够的访问权限
  • order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的 order by 将被覆盖(创建视图时select语句里面的order by会被视图查询时使用的order by覆盖)
  • 视图可以和表一起使用

三.实战OJ

牛客:针对actor表创建视图actor_name_view

四.总结

(一).介绍

视图是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的

通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图时,主要的工作就落在创建这条SQL查询语句上

(二).基本语法

1. 创建:
mysql 复制代码
create [or replace] view 视图名称[(视图列表)] AS select语句[ with [ cascaded | local ] check option] 
# with check option默认是local的

不写WITH [CASCADED | LOCAL] CHECK OPTION 这一部分,那么默认不启用任何 CHECK OPTION 约束。

例子:

sql 复制代码
create view vip_customers as select * from customers where acct_bal > 10000;
#可以通过这个视图执行 insert 或 update,哪怕插入的数据不满足 acct_bal > 10000,数据库也不会报错,它会照样写入到底层表中。
mysql 复制代码
create view china_customers as select * from customers where nation = 'china';

create view vip_china_customers as 
select * from china_customers where acct_bal > 10000 with local check option;
#local check option表示:只检查本视图的条件(acct_bal > 10000)插入或更新时,不会检查上一层china_customers的nation='china'条件

create view vip_china_customers_strict as
select * from china_customers where acct_bal > 10000 with cascaded check option;
#cascaded check option表示:检查当前视图和所有上层视图的条件,插入或更新的数据必须同时满足acct_bal > 10000和nation='china'
  • 对比
写法 行为
不写 WITH CHECK OPTION 视图不限制通过它插入或更新的数据是否满足视图定义条件
WITH LOCAL CHECK OPTION 仅限制当前视图定义中 WHERE 条件满足即可
WITH CASCADED CHECK OPTION 限制所有层级(自身及其依赖视图)都满足
  • 总结

如果不写 WITH CHECK OPTION,那就什么检查都没有;允许你通过视图插入/修改任何数据,即使这些数据插入后不会出现在视图里。

2. 查询:

查看创建视图语句:

mysql 复制代码
show create view 视图名称;

查看视图数据:

mysql 复制代码
select * from 视图名称......;
3. 修改:
  • 方法一:
mysql 复制代码
create [or replace] view 视图名称[(视图列表)] as select语句[ with [ cascaded | local ] check option]
# or replace视图如果存在就替换
  • 方法二:
mysql 复制代码
alter view 视图名称[(视图列表)] as select语句[with [cascaded | local ] check option ]
4. 删除:
mysql 复制代码
drop view [if exists] 视图名称 [,视图名称]

(三).视图-检查选项

1. cascaded

(1).通过with check option子句创建视图时,MySQL会通过视图检查正在更改的每一行,例如插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,他还会检查依赖视图中的规则以保持一致性。为了确定检查范围,mysql提供了两个选项cascaded和local默认值为cascaded

(2).cascaded:对于关联的视图条件也会检查

2. local

local有则检查,没有则不对条件进行检查

(四).更新

视图的更新:视图中的行与基础表中的行之间必须存在一对一的关系,如果包括以下任何一项则不可更新:

  • (1)聚合函数或者窗口函数(SUM() , MIN() , MAX() , AVG() COUNT() )

  • (2)distinct

  • (3)group by

  • (4)having

  • (5)union union all

(五).作用

  1. 简单:简化用户对数据的理解,也能简化操作。

  2. 安全:数据库可以授权,但不能授权到特定的行和列,通过视图可以查询和修改他们所能看见的数据

  3. 数据独立:帮助用户屏蔽真实表结构带来的影响

相关推荐
不爱吃米饭_6 分钟前
MySQL的三大日志详解
mysql
wkj00110 分钟前
php 如何通过mysqli操作数据库?
android·数据库·php
kymjs张涛2 小时前
零一开源|前沿技术周报 #7
android·前端·ios
九皇叔叔2 小时前
【9】PostgreSQL 之 vacuum 死元组清理
数据库·postgresql
风雅的远行者2 小时前
mysql互为主从失效,重新同步
数据库·mysql
晨岳3 小时前
CentOS 安装 JDK+ NGINX+ Tomcat + Redis + MySQL搭建项目环境
java·redis·mysql·nginx·centos·tomcat
宇钶宇夕3 小时前
S7-1200 系列 PLC 中 SCL 语言的 PEEK 和 POKE 指令使用详解
运维·服务器·数据库·程序人生·自动化
绿蚁新亭3 小时前
Spring的事务控制——学习历程
数据库·学习·spring
wuwu_q4 小时前
RK3566/RK3568 Android11 修改selinux模式
android·rk3568
_一条咸鱼_4 小时前
Android Runtime内存共享与访问控制原理剖析(71)
android·面试·android jetpack