视图基础概念
- 定义:视图是一条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视图不支持创建子查询,所以用子查询的时候,要将其拆开使用