创建一个视图
特权
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
一样优化。它不太可能优化得更好。