# MySQL 中的视图

> 原文： [http://zetcode.com/databases/mysqltutorial/views/](http://zetcode.com/databases/mysqltutorial/views/)

在 MySQL 教程的这一部分中，我们将提及视图。

## 查看定义

视图是来自一个或多个表的数据的特定外观。 它可以按特定顺序排列数据，突出显示或隐藏某些数据。 视图由存储的查询组成，该查询可作为由查询结果集组成的虚拟表访问。 与普通表不同，视图不构成物理模式的一部分。 它是根据数据库中的数据计算或整理的动态虚拟表。

视图是伪表。 它是一个存储查询，看起来像一个表。 它可以像表一样被引用。

视图可以将用户限制为特定的行或列，从而增强安全性。 它们可用于连接多个表中的列，使它们看起来像一个表。 它们可用于提供汇总信息。

有几个限制适用于视图。 这里是其中的一些：

*   `SELECT`语句不能包含子查询
*   `SELECT`语句不能引用系统或用户变量
*   定义中引用的任何表或视图都必须存在
*   无法创建临时视图
*   `VIEW`不能与触发器关联

## 创建，修改和删除视图

在下一个示例中，我们创建一个简单的视图。 我们使用`CREATE VIEW`语法创建视图。

```sql
mysql> SELECT * FROM Cars;
+----+------------+--------+
| Id | Name       | Cost   |
+----+------------+--------+
|  1 | Audi       |  52642 |
|  2 | Mercedes   |  57127 |
|  3 | Skoda      |   9000 |
|  4 | Volvo      |  29000 |
|  5 | Bentley    | 350000 |
|  6 | Citroen    |  21000 |
|  7 | Hummer     |  41400 |
|  8 | Volkswagen |  21600 |
+----+------------+--------+ 

```

这是我们的数据，我们在该数据上创建视图。

```sql
mysql> CREATE VIEW CheapCars AS 
    -> SELECT Name FROM Cars WHERE Cost<25000;

```

我们创建一个视图`CheapCars`。 这些是价格低于 25000 的汽车。

```sql
mysql> SELECT * FROM CheapCars;
+------------+
| Name       |
+------------+
| Skoda      |
| Citroen    |
| Volkswagen |
+------------+

```

视图是无法查询的数据库对象。 有三辆便宜的汽车。

```sql
mysql> ALTER VIEW CheapCars AS SELECT Name FROM Cars
    -> WHERE Cost<30000;

mysql> SELECT * FROM CheapCars;
+------------+
| Name       |
+------------+
| Skoda      |
| Volvo      |
| Citroen    |
| Volkswagen |
+------------+

```

我们可以重新定义视图。 假设我们现在认为如果汽车的价格低于 30000，则它会便宜。我们使用`ALTER VIEW`语句修改了我们的视图。

如果我们删除从中选择数据的表，对视图会发生什么？

```sql
mysql> DROP TABLE Cars;

mysql> SELECT * FROM CheapCars;
ERROR 1356 (HY000): View 'mydb.CheapCars' references invalid table(s) 
or column(s) or function(s) or definer/invoker of view lack rights to use them

```

查询视图时，我们收到上述错误。

```sql
mysql> SOURCE cars.sql

mysql> SELECT * FROM CheapCars;
+------------+
| Name       |
+------------+
| Skoda      |
| Citroen    |
| Volkswagen |
+------------+

```

当我们重新创建表时，视图将再次起作用。

```sql
mysql> DROP VIEW CheapCars;

```

最后，使用`DROP VIEW`语法删除视图。

## 寻找视图

我们将提到几种在 MySQL 数据库中查找视图的方法。

```sql
mysql> SHOW FULL TABLES;
+----------------+------------+
| Tables_in_mydb | Table_type |
+----------------+------------+
| AA             | BASE TABLE |
...
| Chars          | BASE TABLE |
| CheapCars      | VIEW       |
| Customers      | BASE TABLE |
| Dates          | BASE TABLE |
| Decimals       | BASE TABLE |
| FavoriteCars   | VIEW       |
...

```

我们可以使用`SHOW FULL TABLES`语句列出数据库中的所有表。 在`Table_type`列中，我们可以看到它是表还是视图。

```sql
mysql> SELECT TABLE_NAME, TABLE_TYPE FROM information_schema.TABLES;
+---------------------------------------+-------------+
| TABLE_NAME                            | TABLE_TYPE  |
+---------------------------------------+-------------+
| CHARACTER_SETS                        | SYSTEM VIEW |
| COLLATIONS                            | SYSTEM VIEW |
| COLLATION_CHARACTER_SET_APPLICABILITY | SYSTEM VIEW |
| COLUMNS                               | SYSTEM VIEW |
| COLUMN_PRIVILEGES                     | SYSTEM VIEW |
| ENGINES                               | SYSTEM VIEW |
...
| Chars                                 | BASE TABLE  |
| CheapCars                             | VIEW        |
| Customers                             | BASE TABLE  |
| Dates                                 | BASE TABLE  |
| Decimals                              | BASE TABLE  |
| FavoriteCars                          | VIEW        |
...

```

在`information_schema`数据库中，有一个`TABLES`表。 `TABLE_NAME`和`TABLE_TYPE`列为我们提供了有关表名及其类型的信息。

```sql
mysql> SELECT TABLE_NAME FROM information_schema.VIEWS;
+--------------+
| TABLE_NAME   |
+--------------+
| CheapCars    |
| FavoriteCars |
+--------------+

```

这是查找视图的最直接方法。 我们查询`information_schema`数据库的`VIEWS`表。

## 使用`UNION`创建视图

的`UNION`运算符用于结果集组合两个或更多`SELECT`语句。 每个选择必须具有相同的列数。

```sql
mysql> CREATE VIEW FavoriteCars AS
    -> SELECT * FROM Cars WHERE Id=7
    -> UNION SELECT * FROM Cars WHERE Id=4
    -> UNION SELECT * FROM Cars WHERE Id=5;

```

我们创建一个名为`FavoriteCars`的视图。 在此视图中，我们有三行被认为是最喜欢的。 三个`SELECT`语句与`UNION`运算符组合在一起。

```sql
mysql> SELECT * FROM FavoriteCars;
+----+---------+--------+
| Id | Name    | Cost   |
+----+---------+--------+
|  7 | Hummer  |  41400 |
|  4 | Volvo   |  29000 |
|  5 | Bentley | 350000 |
+----+---------+--------+

```

这是视图中的`SELECT`。

在 MySQL 教程的这一部分中，我们使用了视图。