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;