SQL View(视图)

视图无非是存储在数据库中的相关名称的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表读取客户姓名和年龄:

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返回一个错误。

以下是创建CUSTOMERS_VIEW 视图例子使用WITH CHECK OPTION:

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

在这种情况下,WITH CHECK OPTION拒绝任何NULL值条目在视图的AGE列,因为该视图由数据定义的不能在AGE栏中有NULL值。

更新视图:

视图在一定条件下可以更新:

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

  • SELECT子句不包含汇总函数

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

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

  • SELECT子句不能包含一个ORDER BY子句。

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

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

  • 查询不包含GROUP BY或HAVING。

  • 计算列无法更新。

  • 从基表中的所有NOT NULL列必须包含在视图是为了使用INSERT查询功能。

所以,如果一个视图满足所有上述规则,那么就可以更新视图。下面是一个例子,更新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客户表的视图:

DROP VIEW CUSTOMERS_VIEW;

链接: https://www.fly63.com/course/32_1561