首页 文章 正文 Mysql-视图 2024-07-02 1193阅读 0评论 一、简介 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。 二、创建视图语法 CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT 语句[WITH[CASCADED|LOCAL] CHECK OPTION] 三、查询视图 查看创建视图语句:SHOW CREATE VIEW 视图名称; 查看视图数据:SELECT * FROM 视图名称 ...; 四、修改视图 方式一: CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句[WITH[EASCADED|LOCAL] CHECK OPTION] 方式二: ALTER VIEW 视图名称[(列名列表)]AS SELECT语句[WITH[CASCADED|LOCAL] CHECK OPTION] 五、删除视图 DROP VIEW [IF EXISTS]视图名称[,视图名称] ... 六、视图的检查选项 当使用WITH CHECK OPTION子句创建视图时,MySOL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。MySOL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。 为了确定检查的范围,mysq!提供了两个选项CASCADED和 LOCAL,默认值为 CASCADED。 CASCADED: 默认选项。 如果视图的定义包含其他视图,则 CASCADED 会检查所有涉及的视图的权限,确保用户对所有基础表和视图都有适当的权限。 LOCAL: 只检查视图本身的权限,而不检查视图引用的其他视图或表的权限。 使用此选项可以避免级联检查权限,适用于您只关心顶层视图权限的情况 示例 假设有两个表 employees 和 departments,并且已经创建了一个视图 emp_dept_view 来联结这两个表: CREATE TABLE employees ( emp_id INT, emp_name VARCHAR(100), dept_id INT ); CREATE TABLE departments ( dept_id INT, dept_name VARCHAR(100) ); CREATE VIEW emp_dept_view AS SELECT e.emp_id, e.emp_name, d.dept_name FROM employees e JOIN departments d ON e.dept_id = d.dept_id; 现在,我们将创建一个新的视图 dept_summary 来引用 emp_dept_view: 使用 CASCADED(默认): CREATE VIEW dept_summary AS SELECT dept_name, COUNT(emp_id) AS num_employees FROM emp_dept_view GROUP BY dept_name WITH CASCADED CHECK OPTION; 这将确保在创建 dept_summary 视图时,用户对 emp_dept_view 以及 employees 和 departments 表都有足够的权限。 使用 LOCAL: CREATE VIEW dept_summary AS SELECT dept_name, COUNT(emp_id) AS num_employees FROM emp_dept_view GROUP BY dept_name WITH LOCAL CHECK OPTION; 这只会检查用户对 dept_summary 视图本身的权限,而不检查 emp_dept_view 或其引用的表的权限。
发表评论
还没有评论,来说两句吧...