SQL – 使用视图
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 是一个 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。
-
可能不会更新计算列。
-
基表中的所有 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;