MySQL 中的视图

网友投稿 765 2023-04-09

MySQL 中的视图

MySQL 中的视图

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MySQL 中的事务
下一篇:MySQL 中连接表
相关文章