# MySQL 中的视图 > 原文: [http://zetcode.com/databases/mysqltutorial/views/](http://zetcode.com/databases/mysqltutorial/views/) 在 MySQL 教程的这一部分中,我们将提及视图。 ## 查看定义 视图 是来自一个或多个表的数据的特定外观。 它可以按特定顺序排列数据,突出显示或隐藏某些数据。 视图由存储的查询组成,该查询可作为由查询结果集组成的虚拟表访问。 与普通表不同,视图不构成物理模式的一部分。 它是根据数据库中的数据计算或整理的动态虚拟表。 视图是伪表。 它是一个存储查询,看起来像一个表。 它可以像表一样被引用。 视图可以将用户限制为特定的行或列,从而增强安全性。 它们可用于连接多个表中的列,使它们看起来像一个表。 它们可用于提供汇总信息。 有几个限制适用于视图。 这里是其中的一些: * SELECT 语句不能包含子查询 * SELECT 语句不能引用系统或用户变量 * 定义中引用的任何表或视图都必须存在 * 无法创建临时视图 * VIEW 不能与触发器关联 ## 创建,修改和删除视图 在下一个示例中,我们创建一个简单的视图。 我们使用`CREATE VIEW`语法创建视图。 ``` 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 | +----+------------+--------+ ``` 这是我们的数据,我们在该数据上创建视图。 ``` mysql> CREATE VIEW CheapCars AS -> SELECT Name FROM Cars WHERE Cost<25000; ``` 我们创建一个视图`CheapCars`。 这些是价格低于 25000 的汽车。 ``` mysql> SELECT * FROM CheapCars; +------------+ | Name | +------------+ | Skoda | | Citroen | | Volkswagen | +------------+ ``` 视图是无法查询的数据库对象。 有三辆便宜的汽车。 ``` mysql> ALTER VIEW CheapCars AS SELECT Name FROM Cars -> WHERE Cost<30000; mysql> SELECT * FROM CheapCars; +------------+ | Name | +------------+ | Skoda | | Volvo | | Citroen | | Volkswagen | +------------+ ``` 我们可以重新定义视图。 假设我们现在认为如果汽车的价格低于 30000,则它会便宜。我们使用`ALTER VIEW`语句修改了我们的视图。 如果我们删除从中选择数据的表,对视图会发生什么? ``` 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 ``` 查询视图时,我们收到上述错误。 ``` mysql> SOURCE cars.sql mysql> SELECT * FROM CheapCars; +------------+ | Name | +------------+ | Skoda | | Citroen | | Volkswagen | +------------+ ``` 当我们重新创建表时,视图将再次起作用。 ``` mysql> DROP VIEW CheapCars; ``` 最后,使用`DROP VIEW`语法删除视图。 ## 寻找视图 我们将提到几种在 MySQL 数据库中查找视图的方法。 ``` 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 列中,我们可以看到它是表还是视图。 ``` 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`列为我们提供了有关表名及其类型的信息。 ``` mysql> SELECT TABLE_NAME FROM information_schema.VIEWS; +--------------+ | TABLE_NAME | +--------------+ | CheapCars | | FavoriteCars | +--------------+ ``` 这是查找视图的最直接方法。 我们查询 information_schema 数据库的`VIEWS`表。 ## 使用`UNION`创建视图 的`UNION`运算符用于结果集组合两个或更多`SELECT`语句。 每个选择必须具有相同的列数。 ``` 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`运算符组合在一起。 ``` mysql> SELECT * FROM FavoriteCars; +----+---------+--------+ | Id | Name | Cost | +----+---------+--------+ | 7 | Hummer | 41400 | | 4 | Volvo | 29000 | | 5 | Bentley | 350000 | +----+---------+--------+ ``` 这是视图中的`SELECT`。 在 MySQL 教程的这一部分中,我们使用了视图。