SQL - 使用视图



视图只不过是存储在数据库中并具有关联名称的 SQL 语句。视图实际上是以预定义的 SQL 查询形式组成的表。

视图可以包含表的所有行或表的选定行。视图可以从一个或多个表创建,这取决于编写用于创建视图的 SQL 查询。

视图是一种虚拟表,允许用户执行以下操作:

  • 以用户或用户类别认为自然或直观的方式组织数据。

  • 以某种方式限制对数据的访问,以便用户只能看到(有时)修改他们需要的内容,而不会更多。

  • 汇总来自多个表的數據,可用于生成报表。

创建视图

数据库视图使用CREATE VIEW语句创建。视图可以从单个表、多个表或另一个视图创建。

要创建视图,用户必须根据具体的实现拥有相应的系统权限。

基本的CREATE VIEW语法如下:

CREATE VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];

您可以像在普通的 SQL SELECT 查询中一样,在 SELECT 语句中包含多个表。

示例

考虑 CUSTOMERS 表具有以下记录:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

以下是如何从 CUSTOMERS 表创建视图的示例。此视图将用于获取 CUSTOMERS 表中的客户姓名和年龄。

SQL > CREATE VIEW CUSTOMERS_VIEW AS
SELECT name, age
FROM  CUSTOMERS;

现在,您可以像查询实际表一样查询 CUSTOMERS_VIEW。以下是一个示例。

SQL > SELECT * FROM CUSTOMERS_VIEW;

这将产生以下结果。

+----------+-----+
| name     | age |
+----------+-----+
| Ramesh   |  32 |
| Khilan   |  25 |
| kaushik  |  23 |
| Chaitali |  25 |
| Hardik   |  27 |
| Komal    |  22 |
| Muffy    |  24 |
+----------+-----+

WITH CHECK OPTION

WITH CHECK OPTION 是 CREATE VIEW 语句的一个选项。WITH CHECK OPTION 的目的是确保所有 UPDATE 和 INSERT 都满足视图定义中的条件。

如果它们不满足条件,则 UPDATE 或 INSERT 将返回错误。

以下代码块包含创建具有 WITH CHECK OPTION 的相同视图 CUSTOMERS_VIEW 的示例。

CREATE VIEW CUSTOMERS_VIEW AS
SELECT name, age
FROM  CUSTOMERS
WHERE age IS NOT NULL
WITH CHECK OPTION;

在这种情况下,WITH CHECK OPTION 应该拒绝在视图的 AGE 列中输入任何 NULL 值,因为视图是由 AGE 列中没有 NULL 值的数据定义的。

更新视图

视图可以在某些条件下更新,如下所示:

  • SELECT 子句可能不包含 DISTINCT 关键字。

  • SELECT 子句可能不包含汇总函数。

  • SELECT 子句可能不包含集合函数。

  • SELECT 子句可能不包含集合运算符。

  • SELECT 子句可能不包含 ORDER BY 子句。

  • FROM 子句可能不包含多个表。

  • WHERE 子句可能不包含子查询。

  • 查询可能不包含 GROUP BY 或 HAVING。

  • 无法更新计算列。

  • 为了使 INSERT 查询能够工作,必须在视图中包含来自基表的所有 NOT NULL 列。

因此,如果视图满足上述所有规则,则可以更新该视图。以下代码块包含一个更新 Ramesh 年龄的示例。

SQL > UPDATE CUSTOMERS_VIEW
   SET AGE = 35
   WHERE name = 'Ramesh';

这最终将更新基表 CUSTOMERS,并且相同的更新将反映在视图本身中。现在,尝试查询基表,SELECT 语句将产生以下结果。

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  35 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

向视图中插入行

可以将数据行插入到视图中。应用于 UPDATE 命令的相同规则也适用于 INSERT 命令。

在这里,我们不能在 CUSTOMERS_VIEW 中插入行,因为我们没有在此视图中包含所有 NOT NULL 列,否则您可以像在表中插入行一样在视图中插入行。

从视图中删除行

可以从视图中删除数据行。应用于 UPDATE 和 INSERT 命令的相同规则也适用于 DELETE 命令。

以下是如何删除 AGE = 22 的记录的示例。

SQL > DELETE FROM CUSTOMERS_VIEW
   WHERE age = 22;

这最终将从基表 CUSTOMERS 中删除一行,并且相同的更新将反映在视图本身中。现在,尝试查询基表,SELECT 语句将产生以下结果。

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  35 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

删除视图

显然,如果不再需要视图,则需要一种删除视图的方法。语法非常简单,如下所示:

DROP VIEW view_name;

以下是如何从 CUSTOMERS 表中删除 CUSTOMERS_VIEW 的示例。

DROP VIEW CUSTOMERS_VIEW;
广告