【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;
相关推荐
数据库急诊室_阿哲9 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋10 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子10 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
Joy T11 小时前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting
杨凯凡12 小时前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql
Aloudata12 小时前
Claude 做数据分析的这两年:一份复盘与发展线索
大数据·数据库·人工智能·数据挖掘·数据分析·dataagent
Decay__12 小时前
01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入
运维·数据库·sql·mysql·架构
zhanghaha131412 小时前
C# 系列教程_12 字符串 string 保姆级系统教程(面向新手,大量示例 + 原理讲解)
开发语言·数据库·c#
韩曙亮12 小时前
【错误记录】安卓 adb 调试 5037 端口占用排查 ( adb 的三层结构 | 找出本机占用 5037 的进程 )
android·数据库·adb·安卓·错误记录
瑞雪兆丰年兮13 小时前
JavaWeb-day07-MySQL(DQL&多表设计)
java·开发语言·数据库·sql·mysql·javaweb·web