SQL - 使用视图

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

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

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

  • 以用户或用户类别自然或直观的方式构建数据.

  • 限制对数据的访问,以便用户可以看到并且(有时)完全修改他们需要的内容而不是更多内容.

  • 汇总各种表格中可用于生成报告的数据.

创建视图

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

要创建视图,用户必须根据具体实现具有适当的系统特权.

基本的 CREATE VIEW 语法如下 :

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

您可以在SELECT语句中包含多个表,方法与在普通SQL 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满足视图定义中的条件.

如果它们不满足条件,则更新或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子句可能不包含set运算符.

  • 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表中删除CUSTOMERS_VIEW的示例.

 
 DROP VIEW CUSTOMERS_VIEW;