本章我们将介绍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
。