MySQL视图相关

视图基础概念

  • 定义:视图是一条SELECT语句执行后返回的结果集,是对若干基本表的引用,是一张虚表,不存储具体数据。
  • 特性:依赖基本表,基本表数据改变时视图数据也随之改变;限定条件下可进行增删改操作。
  • 作用:简化复杂查询操作,增强 SQL语句可读性;实现更精细的权限控制,可将权限限定到行级和列级。
  • 使用场合:在权限控制场景,避免用户访问敏感信息列;当关键信息分散在多个复杂关联表时,通过视图提取所需信息。
  • 列的构成:列的的来源和独立性

可独立插入列:若视图中的列来自不同基表,且这些列可以独立插入到各自的基表中,即列之间不存在复杂的依赖关系,那么视图可能支持插入操作。例如,视图 v_info 由 employees 表的 employee_name 列和 departments 表的 department_name 列组成,这两列在各自基表中可独立插入,就有可能通过视图插入数据。

复杂列计算或聚合:若视图包含通过函数计算、聚合函数(如 SUM、AVG 等)得到的列,或者使用了 DISTINCT、GROUP BY、HAVING 等关键字,通常不允许插入数据。因为这些操作的结果并非直接对应基表的某个列,数据库无法确定如何将插入值分配到基表中。

视图操作

  • 创建视图:格式:CREATE VIEW 视图名称 AS SQL语句。
    MySQL 视图不支持创建子查询,若有子查询需拆开分别创建视图。创建时还可指定algorithm、definer、sql security等参数。
  • 查询视图:格式:SELECT * FROM v1;。
  • 删除视图:格式:DROP VIEW 视图名称。
  • 修改视图:格式:ALTER VIEW 视图名称 AS SQL语句,如ALTER VIEW v1 AS SELECT * FROM A WHERE A.id > 10;。

视图增删改操作限制

  • 多表关联视图:由多张关联表连接而成的视图,不能同时修改多张表的数据。例如在view_user_course视图(基于user、user_course、course表关联创建)上同时修改username和coursename会失败。

插入(INSERT):多表视图一般不允许直接插入数据,因为很难明确数据应该如何在多个基表之间分配。不过,如果视图的定义满足一定条件,例如视图只引用了多个表中可以独立插入的列,且这些列之间没有复杂的关联关系,那么可以通过视图插入数据。

更新(UPDATE):如果多表视图的更新操作只影响到一个基表,并且不违反该基表的约束条件,那么可以对该视图进行更新操作。例如,视图 v_sales 由 orders 表和 customers 表连接而成,若更新操作只涉及 orders 表的列,且满足 orders 表的约束条件,就可以更新该视图。

删除(DELETE):多表视图的删除操作通常也受到限制,只有当删除操作明确只影响一个基表时才可以执行。例如,视图中只涉及一个基表的主键列,通过该视图删除数据时,实际上是删除该基表中对应的数据。

  • 一对一关系视图:在没有其他约束(如视图中缺失的基本表必填字段)时,可以进行增删改数据操作 。

插入(INSERT):只要视图包含了基表中所有非空且无默认值的列,就可以通过视图向基表插入数据。例如,有一个单表视图 v_employees 基于 employees 表创建,且包含了 employees 表中所有非空列,那么就可以使用 INSERT INTO v_employees (col1, col2) VALUES ('value1', 'value2'); 向基表插入数据。

更新(UPDATE):可以对视图中的数据进行更新,更新操作会直接反映到基表上。只要更新的数据满足基表的约束条件,如数据类型、唯一性约束等,更新操作就能成功。

删除(DELETE):可以删除视图中的数据,相应的基表数据也会被删除。

  • 一对多关系视图:基于存在一对多关联的两张表创建,即一张表中的一行可以与另一张表中的多行对应。例如,customers(客户)表和 orders(订单)表,一个客户可以有多个订单。只修改一张表的数据且无其他约束时,可进行改数据操作,但一般不能进行删除和增加操作。

更新(UPDATE):只修改一张表的数据且无其他约束时,可进行改数据操作。因为当只修改一方表的数据时,数据库能够明确将修改操作应用到对应的基表上。例如,若视图 v_customer_orders 基于 customers 表和 orders 表创建,只修改 customers 表中的客户信息(如 customer_name),只要不违反 customers 表的约束条件,就可以通过视图进行修改。

删除(DELETE)和插入(INSERT)操作:一般不能进行删除和增加操作。删除操作可能会导致数据的不一致性,因为删除视图中的一行可能涉及到多张表的数据关联。例如,删除视图中一个客户的订单记录,可能会影响到 customers 表和 orders 表之间的关联关系。增加操作同样难以确定如何将新数据分配到各个基表中,所以通常不允许通过一对多关系视图进行删除和增加操作。

注意

mysql视图不支持创建子查询,所以用子查询的时候,要将其拆开使用

相关推荐
刺客-Andy1 小时前
Python 第二十节 正则表达式使用详解及注意事项
python·mysql·正则表达式
哈__1 小时前
MongoDB 平替新方案:金仓多模数据库驱动电子证照国产化落地
数据库·1024程序员节
微学AI2 小时前
国产数据库替代MongoDB的技术实践过程:金仓多模数据库在电子证照系统中的深度应用
数据库·人工智能·1024程序员节
TDengine (老段)2 小时前
TDengine 数据函数 ROUND 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·1024程序员节
TDengine (老段)2 小时前
TDengine 数学函数 RAND 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
野犬寒鸦2 小时前
从零起步学习MySQL || 第十章:深入了解B+树及B+树的性能优势(结合底层数据结构与数据库设计深度解析)
java·数据库·后端·mysql·1024程序员节
GZ_TOGOGO2 小时前
Oracle OCP考试报名常见问题详解
数据库·oracle·ocp认证
睡不醒的猪儿2 小时前
nginx日志同步阿里云datahub后写入数据库
数据库·nginx·阿里云
xie_zhr2 小时前
【PB案例学习笔记】-46在数据窗口中编辑数据
数据库·his·1024程序员节·干货分享·pb·powerbuilder
小小的木头人3 小时前
Redis 集群安装指南
数据库·redis