MySQL 视图
最后修改于 2023 年 1 月 10 日
在本 MySQL 教程中,我们将介绍视图。
视图定义
一个视图是从一个或多个表中获取数据的特定外观。它可以按某种特定顺序排列数据,突出显示或隐藏某些数据。视图由一个存储的查询组成,该查询可以作为虚拟表访问,该虚拟表由查询的结果集组成。与普通表不同,视图不构成物理模式的一部分。它是一个动态的虚拟表,从数据库中的数据计算或整理而来。
视图是一个伪表。它是一个存储的查询,看起来像一个表。并且可以像表一样引用它。
视图可以限制用户访问特定的行或列,从而增强安全性。它们可用于连接来自多个表的列,使它们看起来像一个表。它们可用于提供聚合信息。
有一些限制适用于视图。以下是其中的一些
- SELECT 语句不能包含子查询
- SELECT 语句不能引用系统或用户变量
- 定义中引用的任何表或视图都必须存在
- 不能创建临时视图
- 视图不能与触发器关联
创建、修改和删除视图
在下一个示例中,我们将创建一个简单的视图。我们使用 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 教程中,我们使用了视图。