-- 创建员工视图
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;