MySQL 视图简介

数据库中数据的查询有时是非常复杂的,如表连接、子查询等。这种查询很难写,而且容易出错。此外,当您专门操作表时,有时只需要操作部分字段。

[En]

The query about the data in the database is sometimes very complex, such as table join, subquery and so on. This kind of query is difficult to write and easy to make mistakes. In addition, when you specifically manipulate the table, it is sometimes required to manipulate only part of the fields.

为了提高复杂 SQL 语句的复用性和表的操作的安全性,MySQL 提供了视图特性。所谓视图,本质上是一种虚拟表,同样包含一系列带有名称的列和行数据。行和列的数据来自自定义视图的查询所引用的基本表,并在具体引用视图时动态生成

视图的特点如下:

  • 视图的列可以来自不同的表,这是在表的抽象和逻辑意义上建立的新关系。
    [En]

    the columns of the view can come from different tables, which is a new relationship established in the abstract and logical sense of the table.*

  • view是由基本表(实表)生成的表(虚表)
    [En]

    View is a table (virtual table) generated by a basic table (real table)*

  • 创建和删除视图不影响基本表
    [En]

    the creation and deletion of views do not affect the basic table*

  • 对视图内容的更新(增删改)直接影响基本表
    [En]

    updates (additions, deletions and changes) to the contents of the view directly affect the basic table*

  • 当视图来自多个基本表时,不允许增加和删除数据
    [En]

    adding and deleting data is not allowed when the view comes from multiple basic tables*

创建视图

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]VIEW view_name [column_list]AS SELECT statement[WITH [CASCADED | LOCAL] CHECK OPTION]
  • CREATE 表示创建新的视图,REPLACE 表示替换已经创建的视图
  • ALGORITHM 表示视图选择的算法,取值有三种:
  • UNDEFINED:MySQL 自动选择算法
  • MERGE:将使用的视图语句与视图定义合并起来,使得视图定义的某一部分取代语句对应的部分
  • TEMPLATE:表示将视图的结果放入临时表,然后用临时表来执行语句
  • view_name 表示视图的名称
  • column_list 为属性列
  • SELECT statement 表示 SELECT 语句
  • 参数 [WITH [CASCADED | LOCAL] CHECK OPTION] 表示视图在更新时保证在视图的权限范围内,CASCADED 与 LOCAL 为可选参数:
  • CASCADED 为默认值,表示更新视图时要满足所有相关视图和表的条件
  • LOCAL 表示更新视图时满足该视图本身定义的条件即可

该语句要求具有针对视图的 CREATE VIEW 权限,以及针对由 SELECT 语句选择的每一列上的某些权限。对于在 SELECT 语句中其他地方使用的列,必须具有 SELECT 权限,如果还有 OR REPLACE 子句,就必须在视图上具有 DROP 权限

示例:在数据库 company 中,由员工表 t_employee 创建出隐藏工资字段 salary 的视图 view_selectemployee

CREATE VIEW view_selectemployee AS
SELECT id,name,gender,age,deptno FROM t_employee;

查询视图

SELECT * FROM view_selectemployee;

示例:在数据库 company 中,由部门表 t_dept 和员工表 t_employee 创建一个名为 view_dept_employee 的视图

CREATE ALGORITHM=MERGE VIEW
view_dept_employee(name,dept,gender,age,loc)
AScSELECT iname,t_dept.deptname,gender,age,t_dept.location
FROM t_employee, t_dept WHERE t_employee.deptno = t_dept.deptno
WITH LOCAL CHECK OPTION;

查看视图

使用 DESCRIBE | DESC 语句查看视图基本信息,因为视图也是一张表,只不过比较特殊

DESCRIBE | DESC viewname

在 MySQL 中,所有视图的定义都存在数据库 information_schema 中的表 views 中,查询 views 表可以得到数据库中所有视图的详细信息

SELECT * FROM information_schema.views
WHERE table_name = 'viewname' \G

修改视图

修改视图是指修改数据库中存在的视图。当基本表的某些字段发生变化时,您可以更改视图以使其与基本表保持一致。

[En]

Modifying the view refers to modifying the view that exists in the database. When some fields of the basic table change, you can change the view to keep it consistent with the basic table.

在 MySQL 中, CREATE OR REPLACE VIEW 语句可以用来修改视图。当视图已经存在,对视图进行修改,否则创建视图

CREATE OR REPLACE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [column_list]
AS SELECT statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

也可以使用 ALTER 语句修改视图,其语法中的关键字和参数都与创建视图是一样的

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [column_list]
AS SELECT statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

更新视图

更新视图是指通过视图来插入、更新和删除表中的数据。可以使用 SQL 语句更新视图,达到更新基本表数据。反过来,更新基本表的数据,也会更新视图的数据

但是,实际上并不是所有的视图都可以更新,在以下情况下不能更新视图:

[En]

However, in fact, not all views can be updated, and views cannot be updated in the following situations:

  • 视图中包含 SUM()、COUNT()、MAX() 和 MIN() 函数
  • 视图中包含 UNION、UNION ALL、DISTINCT、GROUP BY 和 HAVING 等关键字
  • 常量视图,例如: CREATE VIEW view_1 AS SELECT 'Rebecca' AS name;
  • 包含子查询的视图
  • 由不可更新的视图导出的视图
    [En]

    views exported by non-updatable views*

  • 创建视图时,ALGORITHM 为 TEMPTABLE 类型
  • 存在该视图对应的列没有缺省值的列,且该列不包含在该视图中
    [En]

    there is a column with no default value for the column corresponding to the view, and the column is not included in the view*

  • 设置了 [WITH [CASCADED | LOCAL] CHECK OPTION] 参数,需要符合对应条件才能更新

删除视图

删除视图意味着删除数据库中已存在的视图,并且不会删除数据

[En]

Deleting a view means deleting a view that already exists in the database and will not delete the data

在 MySQL 中,可以使用 DROP VIEW 语句来删除视图,但是用户必须拥有 DROP 权限

DROP VIEW viewname [viewname1,viewname2,...]

Original: https://www.cnblogs.com/Yee-Q/p/16154656.html
Author: 低吟不作语
Title: MySQL 视图简介

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505478/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2020年十大最佳自动化测试工具

    Best Automation Testing Tools for 2020 对更快交付高质量软件(或”快速质量”)的需求要求组织以敏捷,持续集成(CI)和…

    数据库 2023年6月9日
    076
  • Pod控制器类型

    Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除…

    数据库 2023年6月14日
    075
  • 使用MySQL,SQL_MODE有哪些坑,你知道么?

    SQL_MODE是MySQL中的一个系统变量(variable),可由多个MODE组成,每个MODE控制一种行为,如是否允许除数为0,日期中是否允许’0000-00-0…

    数据库 2023年6月11日
    084
  • 启用Hyper-v后,重启后界面提示 无法完成功能配置,正在撤销更改

    安装docker后,提示需要启用hyper-v,在控制面板中勾选Hyper-v,然后重启,更新快完成就提示无法完成功能配置,正在撤销更改 解决方法 方法1 控制面板一个一个选 方法…

    数据库 2023年6月14日
    0120
  • 关闭 Windows 10 鼠标移到任务栏图标上显示的预览小卡片(小窗口)

    Windows 10 在默认情况下,鼠标移到任务栏的应用程序窗口图标上,会显示一个类似缩略的小窗口预览卡片的窗口视图。在需要频繁切换窗口的时候,鼠标很容易就移到当前窗口或其他窗口的…

    数据库 2023年6月16日
    0144
  • Redis——数据操作

    2022-09-20 Redis——select Redis数据库中的数据库的个数为: 16个,使用0号数据库开始的,到第15个数据库结束。 在ubantu中,进入Redis客户端…

    数据库 2023年6月14日
    068
  • git仓库push 和 pull只获取部分文件的方法

    gitee项目https://gitee.com/kehaoo/mytest目录结构如下其中part1.txt和part2.txt都是内容都是空的 在另一个文件夹将项目part1文…

    数据库 2023年6月11日
    099
  • RPC学习

    设计协议 相对于 HTTP 的用处,RPC 更多的是负责应用间的通信,所以性能要求相对更高。但 HTTP 协议的数据包大小相对请求数据本身要大很多,又需要加入很多无用的内容,比如换…

    数据库 2023年6月16日
    0107
  • Pisa-Proxy 之 SQL 解析实践

    SQL 语句解析是一个重要且复杂的技术,数据库流量相关的 SQL 审计、读写分离、分片等功能都依赖于 SQL 解析,而 Pisa-Proxy 作为 Database Mesh 理念…

    数据库 2023年6月16日
    0120
  • Java并发编程-线程池

    重点内容 线程池的使⽤ 创建线程池 提交任务 关闭线程池 线程池的原理 合理配置线程池 线程池的监控 1.线程池的创建 new ThreadPoolExecutor(corePoo…

    数据库 2023年6月6日
    092
  • Linx__Ubuntu_APT

    apt是Advanced Packaging Tool的简称。 在Ubuntu下,我们可以使用apt命令进行软件包的 更新, 安装, 删除, 清理等 类似于Windows的软件管理…

    数据库 2023年6月14日
    0121
  • leetcode 669. Trim a Binary Search Tree 修剪二叉搜索树 (简单)

    一、题目大意 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变…

    数据库 2023年6月16日
    087
  • MySQL知识点总结(完整版)

    登录和退出MySQL服务器 登录MySQL $ mysql -u root -p12345612 退&#x…

    数据库 2023年5月24日
    065
  • 尚硅谷Git教程

    尚硅谷Git教程BV1vy4y1s7k6 免费 开源 分布式版本控制工具 / 集中式版本控制工具 本地库、暂存区域、工作流分支 弹幕:应该是git比SVN多了个本地仓库。SVN中央…

    数据库 2023年6月11日
    094
  • 实战 | 线程池的几种自定义扩展

    下图为线程池的构造方法,我们可以自定义一些功能实现项目优化 1、预先启动核心线程 this.prestartAllCoreThreads();使用方式:自定义线程池的构造方法中调用…

    数据库 2023年6月6日
    093
  • 实验:非GTID 一主多从变级联架构

    个个原创文章 欢迎讨论https://www.cnblogs.com/konggg/欢迎转载收藏,转载请注明来源,谢谢支持! Original: https://www.cnblo…

    数据库 2023年6月16日
    0120
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球