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视图不支持创建子查询,所以用子查询的时候,要将其拆开使用

相关推荐
周航宇JoeZhou1 小时前
JP3-3-MyClub后台后端(二)
java·mysql·vue·ssm·springboot·项目·myclub
-SGlow-3 小时前
MySQL相关概念和易错知识点(3)(表内容的CURD、内置函数)
linux·运维·服务器·数据库·mysql
飞翔的佩奇3 小时前
基于SpringBoot+MyBatis+MySQL+VUE实现的经方药食两用服务平台管理系统(附源码+数据库+毕业论文+部署教程+配套软件)
数据库·vue.js·spring boot·mysql·毕业设计·mybatis·经方药食两用平台
bing_1584 小时前
在多租户或多服务共享 Redis 时,如何做逻辑隔离或权限控制?
数据库·redis·缓存
ChaITSimpleLove5 小时前
PostgreSQL 中删除指定数据库下的所有表结构
数据库·postgresql·bash·sql 脚本·.net npgsql
孫治AllenSun6 小时前
【Mysql】字段隐式转换对where条件和join关联条件的影响
数据库·mysql·oracle
生涯にわたる学び7 小时前
数据库02 网页html01 day44
数据库·html
Doris_LMS7 小时前
保姆级别IDEA关联数据库方式、在IDEA中进行数据库的可视化操作(包含图解过程)
java·mysql·postgresql
2301_793086878 小时前
Mysql group by
数据库·mysql
jllllyuz8 小时前
Spring中的事务是如何实现的
数据库·sql·spring