【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;
相关推荐
猫猫的小茶馆2 小时前
基于嵌入式linux的数据库:SQLite
linux·服务器·c语言·数据库·单片机·ubuntu·sqlite
一个假的前端男2 小时前
express(node ORM) 使用 Winston 记录日志 及数据库保存日志
android·数据库·express
浪九天2 小时前
MySQL 数据库基础详细解释和示例
数据库·mysql
怡~2 小时前
Golang适配达梦数据库连接指定模式
开发语言·数据库·golang
小马爱打代码2 小时前
MySQL - 一条查询语句是怎么执行的?
数据库·mysql
yqcoder3 小时前
Express + MongoDB 实现用户登出
数据库·mongodb·express
小王努力学编程3 小时前
【MySQL篇】数据库基础
数据库·mysql
Dav_20993 小时前
DAV_postgresql_2-user_role
数据库·postgresql·oracle
小付爱coding3 小时前
安装Maven配置阿里云地址 详细教程
数据库·阿里云·maven
Kristen_cc3 小时前
assert table_name in self.table_names, “Table {} not found“.format(table_name)
数据库