MySQL 基础知识(九)之视图

目录

1 视图的介绍

2 视图算法

3 创建视图

4 查看视图结构

5 修改视图

6 删除视图

7 参考文档


1 视图的介绍

         视图是一张并不存储数据的虚拟表,其本质是根据 SQL 语句动态查询数据库中的数据。数据库中只存放了视图的定义,通过 SQL 语句使用视图时,会根据视图的定义进行查询。

优点:

  • 简化代码:对于复杂的查询,通过视图可以不用每次都写那么多代码
  • 增加数据的安全性:通过视图,用户只能对指定的数据进行操作

缺点:

  • 查询性能不好:在很多场景下,对视图的查询无法使用基表(基表是创建视图时使用的表)的索引,需要对所有基表进行全表扫描后,将返回结果保存到临时表,再进行查询
  • 维护代价高:基表发生变化时,视图也要进行更改,这需要一定的维护成本。尤其是对于复杂的视图而言,理解和维护视图更加困难

注:关于在实际开发中是否应该使用视图,大家各执一词。随着 MySQL 8.0 版本的视图有了较大的提升,这个话题又引起讨论。非必要不使用,谨慎使用。

2 视图算法

 MySQL 提供了两种视图算法:MERGE 算法和 TEMPTABLE 算法

  • MERGE 算法:会将查询视图的 SQL 语句和创建视图时的查询 SQL 语句进行优化组合,然后对基表进行查询操作
  • TEMPTABLE 算法:首先通过创建视图时定义的查询 SQL 语句在基表上查询,之后将查询结果存入临时表,然后根据临时表重写用户查询视图的 SQL 语句,最后在临时表上执行重写的 SQL 语句并返回结果

不能使用 MERGE 算法的情况:

  • 如果定义视图时的 SELECT 语句包含聚合函数、DISTINCT、GROUP BY、HAVING、UNION (ALL)、子查询,则不允许使用 MERGE 算法
  • 此外,如果 SELECT 语句没有引用表(没有 from 表名),也不允许使用 MERGE 算法

注:对于应该使用 TEMPTABLE 算法却使用 MERGE 算法的视图,MySQL 将生成警告,并将算法设置为 UNDEFINED ( MySQL 会从 MERGE 算法和 TEMPTABLE 算法中选择适合的算法)

提示:客户端输入 SQL 语句字符串 -> 解析器进行解析(获得用户输入的 SQL 语句,query SQL ) -> 获得视图定义(创建视图时使用的 查询 SQL语句,view SQL)-> 优化组合 query SQL 语句和 view SQL 语句 -> 在基表上执行组合后的 SQL 语句 -> 返回查询结果

3 创建视图

创建视图常用代码格式

CREATE[OR REPLACE][ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]VIEW view_name [(column_list)]AS select_statement[WITH [CASCADED | LOCAL] CHECK OPTION]
  • OR REPLACE:用于替换已有的视图
  • ALGORITHM:用于设置视图算法
  • VIEW view_name:用于设置视图名称
  • column_list:用于设置视图列名,默认视图的列名是对应的基表的列名
  • select_statement:select 查询语句
  • WITH CASCADED | LOCAL CHECK OPTION:用于限制对视图进行的插入和更新操作,以确保插入或更新的数据符合视图的定义条件(where 语句中的条件)
    • cascaded: 更新视图时要满足所有相关视图和表的条件
    • local:表示更新视图时满足该视图本身定义的条件即可
    • WITH CHECK OPTION 默认是 WITH CASCADED CHECK OPTION

goods 表

drop table if exists goods;
create table goods (
id int(10) primary key auto_increment,
name varchar(14),
netprice float(7,2),
saleprice float(7,2),
weight float(7,2),
stockdate date
)charset=utf8; #单条插入
insert into goods(name,netprice, saleprice, weight, stockdate) values('香蕉', 2.5, 3.8, 24, '2024-02-13');#多条插入
insert into goods(name,netprice, saleprice, weight, stockdate) values
('苹果', 4.5, 7.2, 15, '2024-02-12'),
('苹果', 4.5, 7.5, 65, '2024-02-14'),
('橘子', 3.2, 4.5, 52, str_to_date('02-12-2024', '%m-%d-%Y')),
('橘子', 2.8, 4.5, 76, '2024-02-13'),
('橘子', 3.1, 5.2, 63, '2024-02-14'),
('葡萄', 2.1, 4.7, 26, str_to_date('2024/02/14', '%Y/%m/%d'));

创建视图 g_view 并查询视图数据

create view g_view as (select id, name, netprice, stockdate from goods);
select * from g_view; 

可更新视图(可以使用 insert、update、delete)

对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系

不是可更新视图的情况:

  • 如果定义视图时的 SELECT 语句包含聚合函数、DISTINCT、GROUP BY、HAVING、UNION (ALL)、子查询(官方文档表述为:位于选择列表中的子查询,我的理解是该子查询是 select 子查询、列名。。。中的子查询),则视图不是可更新视图
  • 如果 SELECT 语句没有引用表(没有 from 表名)、包含 JOIN,则视图也是不可更新视图
  • 如果 FROM 子句中包含不可更新视图、WHERE 子句中的子查询引用了 FROM 子句中的表、ALGORITHM = TEMPTABLE,则视图不是可更新视图

g_view 视图是可更新视图,以下代码对该视图进行插入数据测试,从测试结果我们可以知道:对可更新视图的插入(更新、删除)操作会影响基表,此外,可更新视图的插入(更新、删除)操作只能用于视图已有的列

# 向视图 g_view 插入数据
insert into g_view(name, netprice, stockdate) values('龙眼', 4.5,  '2024-02-17');# 查看视图 g_view
select * from g_view;# 查看基表 goods
select * from goods;

对插入可更新视图数据进行检验 (with cascaded | local check option)

以下代码在创建视图 g_view_1 时,设置筛选条件 where netprice > 4.5 并通过  with cascaded check option 启用检验。之后插入两条数据,一条数据的 netprice = 3.2 < 4.5,插入失败;一条数据的 netprice = 4.9 > 4.5,插入成功。

# 创建 g_view_1 视图,其中 where netprice > 4.5
create view g_view_1 as (select id,name,netprice,stockdate from goods where netprice > 4.5)
with cascaded check option;# 向视图 g_view_1 插入数据 netprice = 3.2 < 4.5
insert into g_view_1(name, netprice, stockdate) values('柚子', 3.2,  '2024-02-17');# 向视图 g_view_1 插入数据 netprice = 4.9 > 4.5
insert into g_view_1(name, netprice, stockdate) values('车厘子', 4.9,  '2024-02-17');

4 查看视图结构

显示表或视图的类型(base table 表示基表,view 表示视图)

show full tables;

显示视图的结构

# 查看视图 g_view 的结构
show create view g_view;

查看视图列信息

# 查看视图 g_view 的列信息
desc g_view;

5 修改视图

使用 alter 修改视图 (和创建一个新的视图没什么区别,只是将 create 换成了 alter)

# 通过 alter 修改视图 g_view
alter view g_view as (select id,name,stockdate from goods);# 查看 g_view 数据
select * from g_view;

使用 create or replace 修改视图(实际是创建一个同名的新视图替换旧视图)

# 通过 create or replace 修改视图 g_view
create or replace view g_view as (select id,name,netprice,stockdate from goods);# 查看 g_view 数据
select * from g_view;

使用 rename 重命名视图

# 修改 g_view 视图的视图名为 g_view_new; 
rename table g_view to g_view_new;# 查看 g_view_new 数据
select * from g_view_new;

6 删除视图

# 删除视图 g_view_new;
drop view g_view_new;# 查看视图或表
show full tables;

7 参考文档

MySQL视图icon-default.png?t=N7T8https://www.zutuanxue.com/home/4/8_341MySQL 8.0 中文文档 第22章:视图 / 22.2. CREATE VIEW语法icon-default.png?t=N7T8https://www.mysqlzh.com/doc/185.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

去掉图片水印但是不伤原图?看完这些方法就知道了

小伙伴们&#xff0c;你们是不是经常在网上找一些好看的图片作为壁纸呢&#xff1f;有时候会遇到一些带着平台水印的图片&#xff0c;是不是觉得不太美观呢&#xff1f;别着急&#xff0c;其实我们可以使用一些去水印软件来将这些水印去除掉&#xff0c;让图片更加美观。那么&a…

Graph + LLM图数据库技术如何助力行业大语言模型应用落地

随着 AI 人工智能技术的迅猛发展和自然语言处理领域的研究日益深入&#xff0c;如何构建强大的大语言模型对于企业来说愈发重要&#xff0c;尤其是在特定行业领域中。 图数据库作为处理复杂数据结构的有力工具&#xff0c;为企业构建行业大语言模型提供了强大的支持。本文将探…

腾讯云4核8G服务器配置性能测评,2024更新

4核8G服务器支持多少人同时在线访问&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&…

扫描电子显微镜(SEM)样品制备要求与方法解析

扫描电子显微镜&#xff08;Scanning Electron Microscope&#xff0c;简称SEM&#xff09;是一种强大的分析工具&#xff0c;广泛应用于材料科学、生物学、医学、半导体材料和化学化工等领域。SEM能够提供高分辨率的表面形貌图像&#xff0c;因此样品制备成为获取准确、清晰图…

Python第十七章(继承)

继承&#xff1a;子类继承父类的所有方法和属性 一。单继承&#xff1a;一个子类继承一个父类 注释&#xff1a;B是子类&#xff0c;继承了A的函数方法&#xff0c;当调用B时候&#xff0c;会同时使用A中的全部方法&#xff0c;object类是顶级类或者基类&#xff0c;其他子类叫…

IP定位技术助力网络安全保护

随着网络技术的不断发展&#xff0c;网络安全问题日益凸显&#xff0c;如何有效保护网络安全已成为亟待解决的问题。IP定位技术作为一种前沿的网络安全防护手段&#xff0c;正在逐步成为网络安全保护的重要工具。 首先&#xff0c;我们要明确什么是IP定位技术。IP定位技术是一…

6.s081 学习实验记录(七)Multithreading

文章目录 一、Uthread: switching between threads简介提示实验代码实验结果 二、Using threads简介实验代码 三、Barrier简介实验代码实验结果 一、Uthread: switching between threads 简介 切换到 thread 分支 git fetchgit checkout threadmake clean 实现用户态线程的…

Python学习路线图

防止忘记&#xff0c;温故知新 进阶路线

使用手持激光三维扫描仪进行建筑立面测量需要注意些什么?

在进行采集作业前&#xff0c;首先需对作业区域进行实地勘察。对于某些有设计感、结构较为特殊的建筑物&#xff0c;若不提前对作业区域勘探&#xff0c;直接进行采集工作&#xff0c;往往会漏掉建筑物的某些结构特征&#xff0c;造成返工。对于建筑物结构相对简单的场景&#…

WordPress主题YIA移动端文章页的面包屑不显示怎么办?

平时我们一般都会在文章页导航菜单下方显示面包屑&#xff0c;类似于“当前位置&#xff1a;boke112百科 WordPress 正文”。平时用浏览器调试站点的时候&#xff0c;在Edge浏览器的“切换设备仿真”中&#xff0c;不管是选择什么设备都会显示面包屑。具体如下图所示&#xf…

数据库数据加密的 4 种常见思路的对比

应用层加解密方案数据库前置处理方案磁盘存取环节&#xff1a;透明数据加密DB 后置处理 最近由于工作需要&#xff0c;我对欧洲的通用数据保护条例做了调研和学习&#xff0c;其中有非常重要的一点&#xff0c;也是常识性的一条&#xff0c;就是需要对用户的个人隐私数据做好加…

【Java程序设计】【C00252】基于Springboot的实习管理系统(有论文)

基于Springboot的实习管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的实习管理系统 本系统分为前台功能模块、管理员功能模块、教师功能模块、学生功能模块以及实习单位功能模块。 前台功能模块&#xf…

Vue-router中使用pinia,const xxxStore = usexxxStore()报错

“getActivePinia()” was called but there was no active Pinia. Are you trying to use a store before calling “app.use(pinia)”? See https://pinia.vuejs.org/core-concepts/outside-component-usage.html for help. This will fail in production. at useStore (pin…

达梦数据库——数据迁移sqlserver-dm报错问题整理

报错情况一&#xff1a;Sql server迁移达梦连接报错’驱动程序无法通过使用安全套接字Q层(SSL)加密与SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferencesITLS127‘ 原因&#xff1a;历史版本的SOL SERVER服务…

D3846——三极管驱动,内置差动电流检测放大器, 共模输入范围宽,大电流输出,工作 频率可高达500KHz

D3846是一块电流模式的PWM控制电路 主要特点: 。自动前馈补偿 。可编程控制的逐个脉冲限流功能 。推挽输出结构^下自动对称校正 。负载响应特性好 。可并联运行&#xff0c;适用于模块系统内置差动电流检测放大器&#xff0c;共模输入范围宽双脉冲抑制功能 。大电流输出&#…

“挖矿”系列:细说Python、conda 和 pip 之间的关系

继续挖矿&#xff0c;挖“金矿”&#xff01; 1. Python、conda 和 pip&#xff08;挖“金矿”工具&#xff09; Python、conda 和 pip 是在现代数据科学和软件开发中常用的工具&#xff0c;它们各自有不同的作用&#xff0c;但相互之间存在密切的关系&#xff1a; Python&…

《白话C++》第10章 STL和boost,Page67~70 std::auto_ptr

std::auto_ptr可以不经意间转移裸指针控制权 std::auto_ptr持有裸指针的控制权&#xff0c;却可以随随便便看似不经意地转移给另一个auto_ptr: #include <iostream> #include <memory>using namespace std;struct S {int a;void SetA(int a){this->a a;}~S()…

SQL Extractor 数据库修复取证大师-数据库修复专家

SQL Extractor 数据库修复取证大师介绍 SQL Extractor 数据库修复取证大师 功能介绍&#xff1a;SQL Extractor数据库修复取证大师最新版本10.94软件特色:针对勒索病毒加密的SQL 数据库有特殊的修复算法,可匹配用友,金蝶数据库结构关系. 支持7.0、SQL2000、SQL2005、SQL2008、…

可视化低代码表单设计器

JNPF 表单设计器是一款在线可视化表单建模工具&#xff0c;基于VueSpringboot技术开发&#xff0c;具有组件丰富、操作简单、所见即所得等特性&#xff0c;既能够设计普通的数据录入表单&#xff0c;也能够配合流程设计出各类审批流转表单。 应用地址&#xff1a;https://www.j…

ForkJoin 的使用以及原理

原理 Fork-Join 是一种并行计算模式&#xff0c;它通常用于解决递归式或者分治式的问题。其原理基于将一个大的任务划分成若干个小任务&#xff0c;然后并行地执行这些小任务&#xff0c;最后将它们的结果合并起来得到最终的结果。 具体来说&#xff0c;Fork-Join 模式包含两个…