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

MySQL 视图(1)

常用视图语句

-- 创建视图
CREATE VIEW t1_view AS SELECT *  FROM t1;
CREATE VIEW v AS VALUES ROW(1,2);-- 查询视图
SELECT * FROM t1_view;-- 查询视图的相关系统视图
SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v';-- 删除视图
DROP VIEW v1,v2;
DROP VIEW IF EXISTS v3,v4;-- 修改视图
ALTER VIEW t1_view AS select * from xxxx;

关于视图

  • MySQL :: MySQL 8.0 Reference Manual :: 15.1.23 CREATE VIEW Statement
  • MySQL :: MySQL 8.0 Reference Manual :: 10.2.2.4 Optimizing Derived Tables, View References, and Common Table Expressionswith Merging or Materialization

视图是从一个或多个表导出的虚拟的表。本质上,视图是一个存储好的查询,用户通过访问这个视图来获取该视图定义的数据。

视图的优势

  • 把经常使用的数据定义为视图以简化SQL操作。数据库的查询大多要使用聚合函数,同时还要显示其它字段的信息,可能还会需要关联到其它表,这时涉及的 SQL 语句可能比较复杂。如果需要频繁执行此查询,就可以通过创建视图简化查询操作,之后只需要执行 SELECT * FROM view_name 就可以获得预期结果。
  • 视图限制用户查询和修改可视的数据范围,提高了数据的安全性。视图是动态的数据集合,数据随着基表的更新而更新。但是视图是虚拟的,物理上是不存在的,只是存储了数据的集合,所以可以将基表中重要的字段信息屏蔽,不通过视图展示给用户。
  • 视图拥有逻辑上的独立性,屏蔽了真实表的结构带来的影响。视图可以使应用程序和数据库的表在一定程度上互相独立。如果没有视图,应用一定是建立在表上的。创建了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。

视图的特点

  • 与表不同,视图没有分配存储空间。从视图引用的基表中提取或派生数据( 除了用于定义数据字典中视图的查询的存储之外,它不需要其他存储)。
  • 在数据库中,基表和视图共享相同的命名空间,因此基表和视图不能具有相同的名称。
  • 视图中无法存在相同名称的列,也无法创建。
  • 可更新视图数据更新后,基表数据同时也会更新(通常情况),但需要注意视图数据与基表非 一 一对应,或者基表有约束或其他关联,视图数据可能更新失败。

视图限制

MySQL :: MySQL 8.0 Reference Manual :: 27.9 Restrictions on Views # 视图限制

  • 视图定义在创建时被“冻结”,并且不受基础表定义的后续更改的影响。例如,如果在表上将视图定义为SELECT*,则稍后添加到基表中的新列不会成为视图的一部分,视图不会报错,但是从基表中删除列会导致查询视图中时出错
  • 视图需要 CREATE_VIEW / SELECT / DROP 权限,以下一 一对应。
    • 创建视图。
    • 对于SELECT语句中其他位置使用的列,需要 SELECT 权限。
    • 对于 OR REPLACE 子句,则还必须具有该视图的DROP权限。
    • 如果存在 DEFINER 子句,则所需的权限取决于用户。
  • 视图列如果手动定义数量,则需要与后面的 select_statement 数量一致。
  • 无法在视图上建立索引。
    • 索引可用于使用在合并算法处理的视图。但是,使用 temptable 算法处理的视图无法利用其基础表上的索引(尽管可以在生成临时表期间使用索引)。
  • SELECT语句不能引用系统变量或用户定义的变量。
  • 在存储程序中,SELECT语句不能引用程序参数或局部变量。
  • SELECT语句不能引用已准备好的语句参数。
  • 定义中引用的任何表或视图都必须存在。如果在创建视图后,删除了定义引用的表或视图,则使用该视图会导致错误。要检查视图定义是否存在此类问题,可以使用 CHECK TABLE 语句。
  • 定义不能引用临时表,也不能创建临时视图。
http://www.lryc.cn/news/351141.html

相关文章:

  • 在排序数组中查找元素的一个位置和最后一个位置-力扣
  • 系统分析师-案例分析-数据库
  • 【RabbitMQ】使用SpringAMQP的消息队列(Hello Word)和工作队列(Work Queue)
  • 项目集成SkyWalking,基于k8s搭建
  • mysql-差异备份流程
  • 基于动态规划算法的DNA序列比对函数,给出两条序列(v和w)的打分矩阵
  • Tailwind CSS快速入门
  • Postman使用技巧
  • sqli-labs靶场
  • 基于springboot的大创管理系统
  • 常用torch.nn
  • 力扣226.翻转二叉树101.对称二叉树
  • word如何按照原本页面审阅文档
  • 前端基础入门三大核心之HTML篇:探索WebAssembly —— 开启网页高性能应用新时代
  • NDIS小端口驱动(四)
  • 用户态网络缓冲区设计
  • Linux运维工程师基础面试题整理(三)
  • 基于单片机与传感器技术的汽车起动线路设计
  • C#如何通过反射获取外部dll的函数
  • 从零开始傅里叶变换
  • 解决1万条数据前端渲染不卡的问题
  • 如何编写一个API——Python代码示例及拓展
  • UMPNet: Universal Manipulation Policy Network for Articulated Objects
  • 高通 Android 12/13冻结屏幕
  • C++实现图的存储和遍历
  • AI--构建检索增强生成 (RAG) 应用程序
  • QT7_视频知识点笔记_4_文件操作,Socket通信:TCP/UDP
  • 智慧社区管理系统:打造便捷、安全、和谐的新型社区生态
  • CustomTkinter:便捷美化Tkinter的UI界面(附模板)
  • 使用MicroPython和pyboard开发板(15):使用LCD和触摸传感器