创建一个视图

特权

CREATE VIEW 语句需要视图的 CREATE VIEW 权限,以及 SELECT 语句选择的每个列的某些权限。对于 SELECT 语句中其他位置使用的列,你必须具有 SELECT 权限。如果存在 OR REPLACE 子句,则还必须具有该视图的 DROP 特权。CREATE VIEW 可能还需要 SUPER 权限,具体取决于 DEFINER 值,如本节后面所述。

引用视图时,将进行权限检查。

视图属于数据库。默认情况下,在默认数据库中创建新视图。要在给定数据库中显式创建视图,请使用完全限定名称

例如:

db_name.view_name

mysql> CREATE VIEW test.v AS SELECT * FROM t;

注 - 在数据库中,基表和视图共享相同的命名空间,因此基表和视图不能具有相同的名称。

一个视图可以:

  • 可以从多种 SELECT 语句中创建
  • 参考基表或其他视图
  • 使用连接,UNION 和子查询
  • SELECT 甚至不需要引用任何表

另一个例子

以下示例定义了一个视图,该视图从另一个表中选择两列以及从这些列计算的表达式:

mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| `qty`  | price | value |
+------+-------+-------+
|    3 |    50 |   150 |
+------+-------+-------+

限制

  • 在 MySQL 5.7.7 之前,SELECT 语句不能在 FROM 子句中包含子查询。
  • SELECT 语句不能引用系统变量或用户定义的变量。
  • 在存储的程序中,SELECT 语句不能引用程序参数或局部变量。
  • SELECT 语句不能引用预准备语句参数。
  • 定义中引用的任何表或视图都必须存在。创建视图后,可以删除
    定义引用的表或视图。在这种情况下,使用视图会导致错误。要检查此类问题的视图定义,请使用 CHECK TABLE 语句。
  • 该定义不能引用 TEMPORARY 表,也不能
    创建 TEMPORARY 视图。
  • 你无法将触发器与视图关联。
  • 将检查 SELECT 语句中列名称的别名,最大列长度为 64 个字符(不是最大别名
    长度为 256 个字符)。
  • VIEW 可能会或可能不会与等效的 SELECT 一样优化。它不太可能优化得更好。