如何创建 MySQL 视图?
MySQL 视图使用 CREATE VIEW 语句创建。视图可以从单个表、多个表或另一个视图创建。我们知道,要创建视图,用户必须根据具体实现拥有适当的系统权限。
基本 CREATE VIEW语法如下 −
语法
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
此处,
CREATE VIEW − 此语句创建一个新视图。
View_name − view_name 是视图的名称。视图始终属于数据库。默认情况下,在当前使用的数据库中创建一个新视图。
Select_statement − select_statement 是一个 SELECT 语句,提供视图的定义。Select_statement 可以从基表或其他视图中选择数据。
Column_list − column_list 部分是可选的。它在视图名称之后立即提供视图列的名称列表,其中名称必须是唯一的。 column_list 中的名称数量必须与 SELECT 语句检索到的列数相同。如果我们想为视图列赋予不同的名称,我们可以通过在选择列表中添加 [AS name] 子句来实现。
OR REPLACE − 如果在 CREATE VIEW 语句中添加可选的 OR REPLACE 子句,则 CREATE VIEW 语句将替换现有视图并创建一个新视图。如果视图不存在,则 CREATE VIEW 与 CREATE OR REPLACE VIEW 相同。
ALGORITHM − ALGORITHM 子句是可选的,它会影响 MySQL 处理视图的方式。ALGORITHM 有三个值:MERGE、TEMPTABLE 或 UNDEFINED。默认算法是 UNDEFINED。
[DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER } ] − DEFINER 和 SQL SECURITY 子句指定在视图调用时检查访问权限时要使用的安全上下文。如果您指定 DEFINER 子句,则以下规则将确定合法的 DEFINER 用户值 −
如果您没有 SUPER 权限,则唯一合法的用户值是您自己的帐户,并且您不能将定义者设置为其他帐户。
如果您拥有 SUPER 权限,则可以指定任何语法上合法的帐户名。
在使用 SQL SECURITY DEFINER 特性定义的存储例程中,CURRENT_USER 返回例程的 DEFINER 值。如果视图定义包含 CURRENT_USER 的 DEFINER 值,这也会影响此类例程中定义的视图。
8. [WITH [CASCADED | LOCAL] CHECK OPTION] − 可以为可更新视图指定 WITH CHECK OPTION 子句,以防止对除 select_statement 中的 WHERE 子句为 true 的行之外的行进行插入或更新。在可更新视图的 WITH CHECK OPTION 子句中,当视图根据另一个视图定义时,LOCAL 和 CASCADED 关键字确定检查测试的范围。LOCAL 关键字将 CHECK OPTION 限制为仅定义的视图。CASCADED 还会导致对底层视图的检查进行评估。当未指定任何关键字时,默认为 CASCADED。
示例
在此示例中,我们在表 ‘Customers’ 上创建一个名为 First_View 的视图,其数据如下 −
mysql> Select * from Customers; +-------------+----------+ | Customer_Id | Name | +-------------+----------+ | 1 | Rahul | | 2 | Yashpal | | 3 | Gaurav | | 4 | Virender | +-------------+----------+ 4 rows in set (1.30 sec) mysql> Create view first_view AS SELECT * FROM Customers; Query OK, 0 rows affected (0.36 sec)
现在,如果我们使用视图的名称运行查询,那么我们将从创建视图的表中获取详细信息。
mysql> Select * from first_view; +-------------+----------+ | Customer_Id | Name | +-------------+----------+ | 1 | Rahul | | 2 | Yashpal | | 3 | Gaurav | | 4 | Virender | +-------------+----------+ 4 rows in set (0.13 sec)