如何创建 MySQL 视图?

mysqlmysqli database

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)

相关文章