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.rhkb.cn/news/259414.html

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

相关文章

【6-1】使用hanlp进行实体抽取以及句法分析(问题待解决)

1.使用hanlp抽取法人名称、企业名称等信息 # -*- coding: utf-8 -*- from pyhanlp import *text1"1998年11月11日&#xff0c;马化腾和同学张志东在广东省深圳市正式注册成立“深圳市腾讯计算机系统有限公司”&#xff0c;之后许晨晔、陈一丹、曾李青相继加入。当时公司…

论文解读:Masked Generative Distillation

文章汇总 话题 知识蒸馏 创新点 带掩盖的生成式蒸馏 方法旨在通过学生的遮罩特征来生成老师的特征(通过遮盖学生部分的特征来生成老师的特征)&#xff0c;来帮助学生获得更好的表现 输入:老师:&#xff0c;学生:&#xff0c;输入:&#xff0c;标签:&#xff0c;超参数: 1:使…

水质监测站工作原理!

TH-LSZ06】水质监测站的工作原理基于现代化学和生物学技术&#xff0c;主要通过化学分析和生物检测两种方法来检测水中有害物质。化学分析技术包括酸碱度、氧化还原电位、重金属离子、有机物、氮和磷等&#xff0c;而生物检测技术则主要关注病毒、细菌、真菌等微生物。 在水质…

Mac M1芯片编译openjdk报错问题解决

使用命令&#xff1a; sudo sh configure --with-target-bits64 用mac m1芯片编译openjdk一直报错&#xff1a; configure: The tested number of bits in the target (64) differs from the number of bits expected to be found in the target (32) configure: error: Cann…

【前端工程化面试题目】webpack 的热更新原理

可以在顺便学习一下 vite 的热更新原理&#xff0c;请参考这篇文章。 首先有几个知识点需要明确 热更新是针对开发过程中的开发服务器的&#xff0c;也就是 webpack-dev-serverwebpack 的热更新不需要额外的插件&#xff0c;但是需要在配置文件中 devServer 属性中配置 hot&a…

云原生之容器编排实践-基于CentOS7搭建三个节点的Kubernetes集群

背景 前面采用 minikube 作为 Kubernetes 环境来体验学习 Kubernetes 基本概念与操作&#xff0c;这样避免了初学者在裸金属主机上搭建 Kubernetes 集群的复杂度&#xff0c;但是随着产品功能的逐渐完善&#xff0c;我们需要过渡到生产环境中的 K8S 集群模式&#xff1b;而在实…

【代码移植】UNIX/Linux/POSIX代码程序移植到Windows系统平台技术汇总与经验分享

​ 图片来源 UNIX (Linux) to Windows代码移植技术路线 MinGW MinGW/MinGW-W64是用Windows原生系统API实现的&#xff0c;在Windows上运行的GCC编译工具链&#xff0c;可以编译出Windows原生应用程序。 MinGW编译工具链的生态位和微软官方的MSVC类似。 优点 MinGW编译出…

计算机网络-数据通信基础

目录 前言 一、数据通信基本概念 二、数据通信相关知识1 总结 前言 正在学习计算机网络体系&#xff0c;把每日所学的知识梳理出来&#xff0c;既能够当作读书笔记&#xff0c;又能分享出来和大家一同学习讨论。 一、数据通信基本概念 基本概念&#xff1a;信源、信道、信宿&…

第二篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:深度解读pyttsx3支持多种语音引擎

传奇开心果短博文系列 系列短博文目录Python的文本和语音相互转换库技术点案例示例系列 短博文目录前言一、三种语音引擎支持介绍和示例代码二、SAPI5引擎适用场景介绍和示例代码三、nsss引擎适用场景介绍和示例代码四、eSpeak适用场景介绍和示例代码五、归纳总结 系列短博文目…

红队学习笔记Day6 --->干货分享

今天看到这样的一个东西&#xff0c;好好好&#xff0c;有点恐怖&#x1f613;&#x1f613;&#x1f631;&#x1f631;&#x1f631;&#x1f631; 我就想网安是不是也有这种东西&#xff1f; 我来试试 icmp&#xff0c;RDP&#xff0c;arp&#xff0c;dhcp&#xff0c;nat&a…

Eclipse - 查看工程或者文件的磁盘路径

Eclipse - 查看工程或者文件的磁盘路径 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explorer 4.1.0 -> Install2. right-click -> Open in ExplorerReferences 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explo…

【Spring MVC篇】参数的传递及json数据传参

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、普通参数的传…

【Java多线程】线程中几个常见的属性以及状态

目录 Thread的几个常见属性 1、Id 2、Name名称 3、State状态 4、Priority优先级 5、Daemon后台线程 6、Alive存活 Thread的几个常见属性 1、Id ID 是线程的唯一标识&#xff0c;由系统自动分配&#xff0c;不同线程不会重复。 2、Name名称 用户定义的名称。该名称在各种…

【开源】SpringBoot框架开发服装店库存管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…

160基于matlab的负熵和峭度信号的盲分离

基于matlab的负熵和峭度信号的盲分离。基于峭度的FastICA算法的收敛速度要快&#xff0c;迭代次数比基于负熵的FastICA算法少四倍以上。SMSE随信噪比增大两种判据下的FastICA算法都逐渐变小&#xff0c;但是基于峭度的算法的SMSE更小&#xff0c;因此基于峭度的FastICA算法性能…

UVa1359/LA3491 Hills

题目链接 本题是2005年ICPC亚洲区域赛杭州欧赛区的H题 题意 平面上有 n&#xff08;n≤500&#xff09;条线段&#xff0c;其中每条线段的端点都不会在其他线段上。你的任务是数一数有多少个“没有被其他线段切到”的三角形&#xff08;即小山&#xff09;。如下图所示&#x…

VTK Python PyQt 监听键盘 控制 Actor 移动 变色

KeyPressInteractorStyle 在vtk 中有时我们需要监听 键盘或鼠标做一些事&#xff1b; 1. 创建 Actor&#xff1b; Sphere vtk.vtkSphereSource() Sphere.SetRadius(10)mapper vtk.vtkPolyDataMapper() mapper.SetInputConnection(Sphere.GetOutputPort()) actor vtk.vtkAc…

winprop二次开发

winprop二次开发 前言工具1——整合多个天线结果用途代码实现 工具2——wallman辅助工具需求代码实现功能实现参数输入实验 前言 工作需求&#xff0c;对该软件进行简单地二次开发&#xff0c;都是一些挺简单的代码&#xff0c;单纯是为了上传之后将其从本地删除 工具1——整…

嵌入式day24

开课复工啦~ 冲冲冲&#xff01; 文件IO&#xff1a; read函数和write函数&#xff1a; &#x1f4da; write 接口有三个参数&#xff1a; fd&#xff1a;文件描述符buf&#xff1a;要写入的缓冲区的起始地址&#xff08;如果是字符串&#xff0c;那么就是字符串的起始地址&…

算法学习系列(三十五):贪心(杂)

目录 引言一、合并果子&#xff08;Huffman树&#xff09;二、排队打水&#xff08;排序不等式&#xff09;三、货仓选址&#xff08;绝对值不等式&#xff09;四、耍杂技的牛&#xff08;推公式&#xff09; 引言 上一篇文章也说过了这个贪心问题没有一个规范的套路和模板&am…