MySQL 基础知识(九)之视图

这篇具有很好参考价值的文章主要介绍了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 语句 -> 返回查询结果

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

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; 

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

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

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

不是可更新视图的情况:

  • 如果定义视图时的 SELECT 语句包含聚合函数、DISTINCT、GROUP BY、HAVING、UNION (ALL)、子查询(请看补充 1),则视图不是可更新视图
  • 如果 SELECT 语句没有引用表(没有 from 表名)、包含 JOIN,则视图也是不可更新视图
  • 如果 FROM 子句中包含不可更新视图、WHERE 子句中的子查询引用了 FROM 子句中的表(请看补充 2)、ALGORITHM = TEMPTABLE,则视图不是可更新视图

补充:

  • 补充 1:对于该子查询,官方文档表述为:“位于选择列表中的子查询”,我的理解是该子查询是 select 子查询、列名。。。中的子查询。该子查询的结果只能是一行,不能是多行(多行报错:“Subquery returns more than 1 row”),对于“视图中的子查询为什么不能返回多行的问题”,GPT 给出:“数据库系统在执行视图中的子查询时,会将其视为一个独立的查询,并将结果限制为一行。这种限制是为了保持视图的简洁性和一致性。如果允许视图中的子查询返回多行结果,可能会导致复杂的查询逻辑和不确定的行为。”

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

  • 补充 2:这种情况,无法更新视图,插入视图报错:“The target table 视图名 of the INSERT is not insertable-into”

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

        在下图代码中,创建完视图 g_view_test1 后,向该视图插入一条数据,结果在该视图中查询不到该数据,查询基表后,可以发现数据已经插入基表。

        分析代码可以得知:该视图采用 MERGE 算法,合并 select * from g_view_test1 和 select id, name from goods where name in (select distinct name from sales) 后的 SQL 语句为  select id, name from goods where name in (select distinct name from sales)

谨慎使用视图,更新视图时,若基表中的列值不能为 NULL,会更新数据失败

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

 

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;

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

对插入可更新视图数据进行检验 (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');

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

4 查看视图结构

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

show full tables;

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

显示视图的结构

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

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

查看视图列信息

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

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

5 修改视图

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

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

# 查看 g_view 数据
select * from g_view;

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

使用 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;

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

使用 rename 重命名视图

# 修改 g_view 视图的视图名为 g_view_new; 
rename table g_view to g_view_new;

# 查看 g_view_new 数据
select * from g_view_new;

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

6 删除视图

# 删除视图 g_view_new;
drop view g_view_new;

# 查看视图或表
show full tables;

MySQL 基础知识(九)之视图,MySQL,mysql,数据库

7 参考文档

MySQL视图https://www.zutuanxue.com/home/4/8_341MySQL 8.0 中文文档 第22章:视图 / 22.2. CREATE VIEW语法https://www.mysqlzh.com/doc/185.html文章来源地址https://www.toymoban.com/news/detail-826387.html

到了这里,关于MySQL 基础知识(九)之视图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL基础篇——MySQL数据库客户端连接,数据模型,SQL知识

    作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.客户端连接MySQL 二. 数据模型 1.关系型数据库(RDBMS) 2.数据模型 三.SQL 1.SQL通用语法 2.SQL分类 3.数据库操作 1). 查

    2024年02月06日
    浏览(50)
  • MySQL 基础知识(九)之视图

    目录 1 视图的介绍 2 视图算法 3 创建视图 4 查看视图结构 5 修改视图 6 删除视图 7 参考文档 1 视图的介绍          视图是一张并不存储数据的虚拟表,其本质是根据 SQL 语句动态查询数据库中的数据。数据库中只存放了视图的定义,通过 SQL 语句使用视图时,会根据视图

    2024年02月19日
    浏览(23)
  • MySQL数据库基础初学者必备知识

    目录 1.数据库的基本操作 1.1显示所有数据库 1.2创建数据库 1.3删除数据库 2.数据库的类型 2.1数值类型 2.2字符串类型 2.3日期类型 3.表的简单操作 3.1创建一个表 3.2显示表的结构 3.3显示数据库中的所有表 3.4删除指定表 4.实战练习 数据库的基本操作为:显示数据库,创建数据库

    2023年04月11日
    浏览(53)
  • 【数据库】MySQL概念性基础知识期末复习

    第一章 3 二维表结构……数据模型—— 关系数据模型 5 描述全部数据整体逻辑结构—— 模式 6 逻辑数据独立性—— 模式变,外模式和应用程序不变 7 物理数据独立性—— 内模式变,外模式和应用程序不变 9 R-(R-S)—— R∩S 10 从两个关系笛卡尔积中选取他们属性间满足一定条

    2024年02月02日
    浏览(108)
  • MySQL入门指南:数据库操作的基础知识

    当谈到关系型数据库管理系统(RDBMS)时,MySQL无疑是最常见和广泛使用的一个。它是一个强大的工具,用于存储、管理和检索数据。在这篇博客中,我们将介绍MySQL的基本知识,包括数据库的操作、数据表的操作以及数据的增删改查~~ 目录 1. 数据库的操作 1.1 创建数据库 1.2 删除

    2024年02月07日
    浏览(85)
  • MySQL 基础知识(一)之数据库和 SQL 概述

    目录 1 数据库相关概念 2 数据库的结构 ​3 SQL 概要 4 SQL 的基本书写规则 1 数据库相关概念 数据库是将大量的数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合 数据库管理系统(DBMS)是用来管理数据库的计算机系统,通过使用 DBMS,多个用户可以安全、简单

    2024年02月20日
    浏览(36)
  • mysql+sqlyog的超详细完整安装+数据库基础知识

    地址:https://dev.mysql.com/downloads/mysql/5.5.html#downloads 注册或登录Oracle账户下载 复制到文件路径至bin的到 此电脑——高级系统设置——高级——环境变量—— 点下面的path 新建粘贴路径即可 一路确定 环境配置完成后,打开文件夹,创建一个新的文件后缀名为 .ini 的 my.ini空白文

    2024年02月06日
    浏览(35)
  • 找工作所需数据库基础知识与实际操作(以MySQL为例)

    第一章、数据库原理概述 1.1.2 数据库、数据字典、数据库管理系统、数据库系统 1. 数据库(DB)--- (1)概念:按一定结构组织并长期存储在计算机内的、在逻辑上保持一致的、可共享的大量相关数据的集合---存储数据仓库 (2)属性:较小的冗余度、较高的数据独立性、易

    2024年02月05日
    浏览(43)
  • mysql数据库面试题基础知识,Hadoop之MapReduce04,腾讯java面试流程

    该方法的执行过程比较复杂,我们慢慢来分析,首先来看下简化的时序图 3.1waitForCompletion public boolean waitForCompletion(boolean verbose ) throws IOException, InterruptedException, ClassNotFoundException { // 判断任务的状态,如果是DEFINE就提交 if (state == JobState.DEFINE) { submit(); } if (verbose) { // 监听并且

    2024年04月14日
    浏览(46)
  • MySQL-创建和管理表:基础知识、创建和管理数据库、创建表、修改表、重命名表、删除表、清空表、拓展

    注:此为笔者学习尚硅谷-宋红康MySQL的笔记,其中包含个人的笔记和理解,仅做学习笔记之用,更多详细资讯请出门左拐B站:尚硅谷!!! 1.1 一条数据存储的过程 存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只能是一团

    2024年04月11日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包