详细讲解oracle的视图
视图的定义
视图是从一个或多个表(也可以是其他视图)导出的虚拟表。它本身并不存储实际的数据,实际的数据仍存放在基表中。视图就像是一个窗口,通过它可以查看或处理数据库里的数据。对视图进行查询时,Oracle 会依据视图的定义,从基表中获取所需的数据。
视图的用途
视图在数据库操作中有多种用途,具体如下:
- 简化复杂查询:当需要频繁使用复杂的连接查询或子查询时,可以将其定义为视图。这样在后续使用时,只需简单地查询该视图即可,无需每次都编写复杂的 SQL 语句。
- 限制数据访问:通过视图可以只向用户展示他们需要看到的数据,而隐藏基表中的其他敏感列或行。例如,只允许用户查看员工表中的部分字段,如姓名、部门等,而不显示工资等敏感信息。
- 提供数据逻辑独立性:当基表的结构发生变化时,如列名修改、表结构调整等,只需相应地修改视图的定义,而不需要修改依赖于该视图的应用程序,从而减少了对应用程序的影响。
- 兼容旧版本应用:在数据库升级或表结构变更时,为了保证旧版本的应用程序能够继续正常运行,可以创建视图来模拟旧表的结构,使旧应用程序可以通过视图继续访问数据。
视图的创建
创建视图的基本语法如下:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(column_alias1, column_alias2, ...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint_name]]
[WITH READ ONLY [CONSTRAINT constraint_name]];
下面对语法中的关键参数进行说明:
- OR REPLACE:使用这个参数可以替换已存在的视图,这样就不需要先删除原视图再创建新视图。
- FORCE:即使基表不存在,也能创建视图。不过,在查询该视图时,如果基表仍未创建,就会报错。
- WITH CHECK OPTION:对视图进行 DML(插入、更新、删除)操作时,会确保操作的数据满足视图定义中的条件。
- WITH READ ONLY:禁止对视图进行 DML 操作,只能进行查询操作。
下面看几个创建视图的示例:
-- 简单视图示例
CREATE VIEW emp_dept_view AS
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;-- 带条件的视图示例
CREATE VIEW high_salary_employees AS
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > 10000;-- 复杂视图示例(包含函数和分组)
CREATE VIEW dept_salary_summary AS
SELECT d.department_name, COUNT(e.employee_id) AS employee_count, AVG(e.salary) AS avg_salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
GROUP BY d.department_name;
视图的查询
查询视图的方式与查询普通表相同,例如:
SELECT * FROM emp_dept_view;
SELECT department_name, avg_salary FROM dept_salary_summary;
视图的更新
对于简单视图,通常可以进行 DML 操作(插入、更新、删除),但需要满足一定的条件:
- 视图定义中不能包含 GROUP BY、DISTINCT、聚合函数等。
- 如果视图定义中包含基表的 NOT NULL 列,那么在插入数据时必须为这些列提供值。
- 如果使用了 WITH CHECK OPTION,那么 DML 操作不能违反视图定义中的条件。
不过,复杂视图一般不支持 DML 操作。例如,包含聚合函数、GROUP BY 子句或连接多个表的视图通常是不可更新的。
视图的修改和删除
- 修改视图:可以使用 CREATE OR REPLACE VIEW 语句来修改已存在视图的定义。
- 删除视图:使用 DROP VIEW 语句删除视图,语法如下:
DROP VIEW view_name;
需要注意的是,删除视图不会影响基表的数据。
视图的限制和注意事项
在使用视图时,有一些限制和注意事项需要了解:
- 视图的性能取决于基表的结构和查询复杂度。如果基表数据量很大,或者视图定义中的查询很复杂,可能会影响查询性能。
- 复杂视图(如包含聚合函数或 GROUP BY 的视图)通常不支持 DML 操作。
- 视图的定义会被存储在数据字典中(如 USER_VIEWS、ALL_VIEWS、DBA_VIEWS),可以通过查询这些数据字典来查看视图的定义信息。
- 在使用 FORCE 选项创建视图时要谨慎,因为这样可能会创建出无效的视图。
通过合理使用视图,可以提高数据库的安全性、简化查询操作,并增强数据的逻辑独立性。