【Oracle】视图用法和示例

【Oracle】视图用法和示例

在 Oracle 数据库中,视图是一种虚拟表,它本身并不存储实际的数据,而是基于一个或多个表(或其他视图)的查询结果集。下面从视图的定义、创建、使用、修改、删除以及优缺点等方面详细为你讲解Oracle 中的视图。

1.视图的定义和原理

视图是一个预定义的 SQL 查询,它封装了复杂的查询逻辑。当用户查询视图时,实际上是执行了定义视图时的 SQL 查询语句,并返回查询结果。视图可以简化数据访问,提高数据安全性,同时还能提供数据的逻辑独立性。

2.创建视图

创建视图使用 CREATE VIEW 语句,基本语法如下:

CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name [(column1, column2, ...)]

AS

select_statement

[WITH [CHECK OPTION [CONSTRAINT constraint_name]]]

[WITH READ ONLY [CONSTRAINT constraint_name]];

参数说明:

OR REPLACE:如果视图已经存在,则替换原有的视图定义。FORCE:即使基表不存在,也可以创建视图;NOFORCE(默认)表示只有基表存在时才能创建视图。view_name:视图的名称。(column1, column2, …):可选参数,用于指定视图列的名称。select_statement:定义视图的查询语句。WITH CHECK OPTION:确保通过视图插入、更新或删除的数据满足视图定义中的 WHERE 子句条件。WITH READ ONLY:将视图设置为只读,禁止通过视图进行插入、更新或删除操作。

3.使用视图

使用视图就像使用普通表一样,可以进行 SELECT 查询操作。

-- 查询 it_employees_view 视图

SELECT * FROM it_employees_view;

4.修改视图

修改视图可以使用 CREATE OR REPLACE VIEW 语句,重新定义视图的查询逻辑。

-- 修改 it_employees_view 视图,增加显示员工的邮箱信息

CREATE OR REPLACE VIEW it_employees_view

AS

SELECT employee_id, first_name, last_name, email

FROM employees

WHERE department = 'IT';

5.删除视图

删除视图使用 DROP VIEW 语句。

-- 删除 it_employees_view 视图

DROP VIEW it_employees_view;

6.视图的优点

简化查询:将复杂的查询封装在视图中,用户只需查询视图,无需编写复杂的 SQL 语句。提高数据安全性:可以通过视图只向用户暴露部分数据,隐藏敏感信息。例如,创建一个只显示员工姓名和部门的视图,而不显示工资等敏感信息。提供数据的逻辑独立性:当基表的结构发生变化时,只需修改视图的定义,而不需要修改使用视图的应用程序。

7.视图的缺点

性能开销:视图是基于查询的,每次查询视图时都要执行视图定义中的查询语句,可能会导致性能下降,尤其是对于复杂的视图。更新限制:有些视图是不可更新的,例如包含聚合函数、GROUP BY 子句等的视图。即使视图是可更新的,也可能受到 WITH CHECK OPTION 等约束的限制。

8.可更新视图

一般来说,满足以下条件的视图是可更新的:

视图的 SELECT 语句只引用了一个表。视图的 SELECT 列表中不包含聚合函数、GROUP BY、DISTINCT 等。视图的 SELECT 列表中包含基表的主键或唯一键。

-- 创建一个可更新的视图

CREATE VIEW single_table_view

AS

SELECT employee_id, first_name, last_name

FROM employees;

-- 通过视图更新数据

UPDATE single_table_view

SET first_name = 'John'

WHERE employee_id = 1;

综上所述,视图是 Oracle 数据库中非常有用的工具,合理使用视图可以提高数据库的可维护性和安全性,但在使用时也需要考虑性能和更新限制等问题。

9.具体示例:

9.1创建视图

单表简单视图

-- 创建一个显示员工姓名和部门的视图

CREATE VIEW employee_department_view

AS

SELECT first_name, last_name, department_id

FROM employees;

多表关联复杂视图

-- 创建一个显示员工姓名、部门名称和工资的视图

CREATE VIEW employee_detail_view

AS

SELECT e.first_name, e.last_name, d.department_name, e.salary

FROM employees e

JOIN departments d ON e.department_id = d.department_id;

9.2修改视图

增加列

-- 为视图添加员工邮箱列

CREATE OR REPLACE VIEW employee_department_view

AS

SELECT first_name, last_name, department_id, email

FROM employees;

修改查询条件

-- 修改视图,只显示特定部门的员工

CREATE OR REPLACE VIEW employee_detail_view

AS

SELECT e.first_name, e.last_name, d.department_name, e.salary

FROM employees e

JOIN departments d ON e.department_id = d.department_id

WHERE d.department_name = 'IT';

9.3使用视图

查询视图

-- 查询员工部门视图

SELECT * FROM employee_department_view;

-- 带条件查询员工详细视图

SELECT * FROM employee_detail_view WHERE salary > 5000;

通过视图更新数据

-- 更新员工的部门ID

UPDATE employee_department_view

SET department_id = 20

WHERE first_name = 'John' AND last_name = 'Doe';

9.4删除视图

-- 删除员工部门视图

DROP VIEW employee_department_view;

-- 删除员工详细视图

DROP VIEW employee_detail_view;

相关文章

揭秘最贵布加迪车型排名
365betapp投注

揭秘最贵布加迪车型排名

📅 07-24 👁️ 8121
[讨论]6.16 21点 因000006 被封战网的,7个号均已回归,活动已结束,希望无辜者都能自动解封
魔兽世界副本重置攻略,轻松掌握重置技巧,魔兽世界副本重置全攻略,快速掌握重置技巧与机制解析
《蓝宇》刘烨裸战胡军! 关锦鹏揭删减真相:这两幕不该存在
原创50岁鲁豫辟谣只吃每天3粒米,脸颊凹陷身材暴瘦,疑另有原因?
广州 至 长沙 列车 中国高铁车票及时刻表
365bet备用开户

广州 至 长沙 列车 中国高铁车票及时刻表

📅 10-09 👁️ 7010