当前位置: 首页 > article >正文

[MySQL]视图

视图是什么 

     视图(View)是一种虚拟存在的表。视图中的数据,来自定义视图的查询语句中,使用的表,并且是在使用视图时动态生成的。

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

为什么要使用视图(视图的作用)

1.简化查询语句

    与Java等语言中的方法一样,对于重复使用到的查询语句(比如作为子查询,代表一个列或者用于WHERE的条件判断),可以将其定义成视图。这样子使用时就直接调用视图即可,项目越大,越能简化查询语句。

2.保护数据安全

    表可以授权,但不能授权到 特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据,也能帮用户屏蔽真实表结构变化带来的影响 。如果你想让别人只能看到一张表中的个别字段的数据,此时就会使用到视图。

视图的基本操作

# 创建视图
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS 
    SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ];

# 查看视图的创建语句
SHOW CREATE VIEW 视图名称;

# 查询视图中的数据
SELECT 字段名 FROM 视图名称 ...;//与查询表的语句一样

# 修改视图
# 方式一:直接覆盖
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] 
    AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] 
# 方式二:修改
ALTER VIEW 视图名称[(列名列表)] 
    AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

# 删除视图
DROP VIEW [IF EXISTS] 视图名称 [,视图名称] ...

    注意,想要使视图能够更新,视图中的行与基础表中的行之间必须存在一对一的关系。  

    视图包含以下任何一项,则该视图不可更新:

A. 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)

B. DISTINCT

C. GROUP BY

D. HAVING

E. UNION 或者 UNION ALL

检查选项 

    当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入、更新、删除,以使其符合视图的定义。 MySQL还允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项:

    CASCADED 和 LOCAL,默认值为 CASCADED 。

CASCADED:假设有两个视图为v1和v2。v2是基于v1创建的,如果v2的检查规则定义为CASCADED(或者未指定,则默认也为CASCADED)。此时,使用v2插入数据时,不仅会检查v2的检查条件,还会检查v1的检查条件

CREATE OR REPLACE VIEW v1 AS SELECT empno,ename,sal FROM emp_back WHERE sal<=2000;

CREATE OR REPLACE VIEW v2 AS SELECT  empno,ename,sal FROM v1 WHERE sal>=1000
WITH CASCADED CHECK OPTION;

INSERT INTO v2 VALUES(8080,'TOM',1888);
INSERT INTO v2 VALUES(8081,'MARY',2500);

    执行上述代码时,8080可以插入成功,但是8081插入不会成功。虽然8081的sal为2500,满足v2的sal>=1000,但是不满足v1的sal<=2000,所以插入不成功。

LOCAL: 执行检查时,只会检查v2,不会检查v2的关联视图v1

将之前v2的CASCADED修改为LOCAL,此时就可以发现,8081可以插入成功了,因为它不再检查v1的sal<=2000。


http://www.kler.cn/a/383799.html

相关文章:

  • Linux多线程(个人笔记)
  • 从0开始搭建一个生产级SpringBoot2.0.X项目(十二)SpringBoot接口SpringSecurity JWT鉴权
  • Spring挖掘:(AOP篇)
  • 目标检测的不同检测器
  • 算法——双指针
  • 和的逆运算问题
  • 大数据中的Kafka, Zookeeper,Flume,Nginx, Sqoop与ETL
  • 一文读懂:AIOps 从自动化运维到智能化运维
  • C#如何快速获取P/Invoke方法签名
  • 【ChatGPT】让ChatGPT生成跨语言翻译的精确提示
  • iOS灵动岛动画小组件怎么播放动画
  • Python实例:爱心代码
  • PySpark本地开发环境搭建
  • 【Pytorch】基本语法
  • ssm052游戏攻略网站的设计与实现+vue(论文+源码)-kaic
  • Hyperledger Fabric 入门笔记(十六)Fabric V2.5 测试网络部署补充 - 手动从通道中移除组织
  • 使用C++和libcurl库实现HTTP请求(GET、POST、文件上传)
  • 微信小程序,点击bindtap事件后,没有跳转到详情页,有可能是app.json中没有正确配置页面路径
  • lua入门教程:数字
  • 后端:Spring、Spring Boot-配置、定义bean
  • 法语je vais bien
  • 6 张图带你深入了解 kube-scheduler
  • Minimalist GNU for Windows
  • WPS单元格重复值提示设置
  • 【NLP】使用 SpaCy、ollama 创建用于命名实体识别的合成数据集
  • OPC通信