Oracle视图基础

1. 基本语法

复制代码
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name
[(column_name [, column_name]...)]
AS subquery
[WITH {CHECK OPTION | READ ONLY} CONSTRAINT constraint_name];

2. 简单视图示例

创建基本视图

复制代码
-- 创建员工视图
CREATE VIEW emp_view AS
SELECT employee_id, first_name, last_name, salary, department_id
FROM employees
WHERE department_id = 20;

创建带别名的视图

复制代码
CREATE VIEW emp_dept_view (emp_id, name, dept_name, salary) AS
SELECT e.employee_id, 
       e.first_name || ' ' || e.last_name,
       d.department_name,
       e.salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

只读视图

复制代码
CREATE OR REPLACE VIEW read_only_emp_view AS
SELECT employee_id, first_name, last_name, hire_date
FROM employees
WITH READ ONLY CONSTRAINT ro_emp_view;

带检查选项的视图

复制代码
CREATE OR REPLACE VIEW high_salary_emp AS
SELECT employee_id, first_name, salary
FROM employees
WHERE salary > 5000
WITH CHECK OPTION CONSTRAINT chk_salary;

5. 物化视图

复制代码
-- 创建物化视图
CREATE MATERIALIZED VIEW mv_emp_summary
REFRESH COMPLETE ON DEMAND
AS
SELECT department_id,
       COUNT(*) emp_count,
       AVG(salary) avg_salary
FROM employees
GROUP BY department_id;

6. 使用CTE(公共表表达式)创建复杂视图

复制代码
CREATE OR REPLACE VIEW complex_analysis_view AS
WITH 
-- 第一步:基础数据处理
emp_data AS (
    SELECT e.employee_id,
           e.first_name || ' ' || e.last_name AS full_name,
           e.salary,
           e.department_id,
           e.hire_date,
           EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM e.hire_date) AS years_of_service
    FROM employees e
    WHERE e.salary > 3000
),

-- 第二步:部门汇总
dept_summary AS (
    SELECT d.department_id,
           d.department_name,
           COUNT(ed.employee_id) AS emp_count,
           AVG(ed.salary) AS avg_salary
    FROM departments d
    LEFT JOIN emp_data ed ON d.department_id = ed.department_id
    GROUP BY d.department_id, d.department_name
),

-- 第三步:薪资等级分类
salary_analysis AS (
    SELECT ed.department_id,
           SUM(CASE WHEN ed.salary < 5000 THEN 1 ELSE 0 END) AS low_salary_count,
           SUM(CASE WHEN ed.salary BETWEEN 5000 AND 10000 THEN 1 ELSE 0 END) AS medium_salary_count,
           SUM(CASE WHEN ed.salary > 10000 THEN 1 ELSE 0 END) AS high_salary_count
    FROM emp_data ed
    GROUP BY ed.department_id
)

-- 最终结果
SELECT ds.department_name,
       ds.emp_count,
       ds.avg_salary,
       sa.low_salary_count,
       sa.medium_salary_count,
       sa.high_salary_count,
       ROUND(ds.avg_salary * ds.emp_count) AS total_dept_salary
FROM dept_summary ds
LEFT JOIN salary_analysis sa ON ds.department_id = sa.department_id
ORDER BY ds.avg_salary DESC;

7. 视图操作

修改视图

复制代码
-- 替换现有视图
CREATE OR REPLACE VIEW emp_view AS
SELECT employee_id, first_name, last_name, salary, hire_date
FROM employees
WHERE salary > 3000;

删除视图

复制代码
DROP VIEW emp_view;

重新编译视图

复制代码
ALTER VIEW emp_view COMPILE;
相关推荐
不可求~7 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
Lumistory7 小时前
城市建筑照明的落地与长效运营观察
大数据·数据库·中间件·光照贴图
围炉聊科技10 小时前
长期免费的数据库方案——零成本基建系列
数据库
AC赳赳老秦10 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
梁辰兴12 小时前
软件工程:数据结构设计
数据库·软件工程·设计原则·设计方法·梁辰兴·数据库结构设计·数据库结构类型
AC赳赳老秦12 小时前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw
灯澜忆梦13 小时前
【MySQL18】进阶篇 | MySQL管理
数据库·mysql
zcmodeltech13 小时前
智能制造教学实训沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的工业机器人-智慧工厂-数字孪生全场景联动方案
数据库·stm32·嵌入式硬件·机器人·制造·多分类
AI多Agent协作实战派13 小时前
AI多Agent协作系统实战(四十):AI说“没有错误“,系统判了“测试失败“——一个正则的误判
数据库·人工智能
隔窗听雨眠14 小时前
OceanBase接入DeepSeek:数据库与AI的深度融合如何改写企业数据规则
数据库·人工智能·oceanbase