视图只不过是存储在具有关联名称的数据库中的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是一个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;