上一篇
想象一下,你是一家电商公司的数据分析师,每天需要从几十张表中提取数据:用户信息、订单记录、商品库存、物流状态...每次写SQL都要关联五六个表,还要反复计算某些指标,不仅麻烦还容易出错。
这时候,视图(View)就能派上用场了,它就像给复杂的SQL查询结果拍了个"快照",下次直接用这个快照名称就能获取数据,不用再写冗长的查询语句,今天我们就来聊聊Oracle中视图的创建和处理技巧。
视图本质上是一个虚拟表,它不实际存储数据,而是保存了一条SQL查询语句,当你查询视图时,Oracle会实时执行这条语句并返回结果。
视图的三大优点:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 视图名称 [(列别名1, 列别名2...)] AS SELECT查询语句 [WITH CHECK OPTION] [CONSTRAINT 约束名] [WITH READ ONLY];
关键参数说明:
OR REPLACE
:如果视图已存在则替换 FORCE
:即使基表不存在也强制创建(基表后续补上才能查询) WITH CHECK OPTION
:通过视图修改数据时,必须满足视图的WHERE条件 WITH READ ONLY
:禁止通过视图修改数据 -- 创建一个显示部门平均薪资的视图 CREATE VIEW dept_avg_salary AS SELECT d.department_name, ROUND(AVG(e.salary), 2) avg_salary, COUNT(e.employee_id) employee_count FROM departments d JOIN employees e ON d.department_id = e.department_id GROUP BY d.department_name;
-- 创建一个带检查约束的视图(只能看到IT部门的员工) CREATE OR REPLACE VIEW it_employees AS SELECT employee_id, first_name, last_name, email FROM employees WHERE department_id = 60 -- IT部门的ID WITH CHECK OPTION CONSTRAINT it_employee_check;
和查普通表完全一样:
SELECT * FROM dept_avg_salary WHERE avg_salary > 10000 ORDER BY employee_count DESC;
-- 给视图增加奖金字段 CREATE OR REPLACE VIEW dept_avg_salary AS SELECT d.department_name, ROUND(AVG(e.salary), 2) avg_salary, ROUND(AVG(e.commission_pct), 2) avg_bonus, COUNT(e.employee_id) employee_count FROM departments d JOIN employees e ON d.department_id = e.department_id GROUP BY d.department_name;
DROP VIEW it_employees;
SELECT text FROM user_views WHERE view_name = 'DEPT_AVG_SALARY';
ALTER VIEW 视图名 COMPILE
重新编译 普通视图每次查询都重新执行SQL,而物化视图(Materialized View)会存储实际数据,适合以下场景:
创建物化视图示例:
CREATE MATERIALIZED VIEW mv_sales_summary REFRESH COMPLETE ON DEMAND AS SELECT product_id, SUM(quantity) total_qty FROM order_items GROUP BY product_id;
视图是Oracle数据库管理中非常实用的功能,就像给SQL查询装上了"快捷方式",合理使用视图可以:
✅ 让复杂查询变得简单
✅ 保护敏感数据字段
✅ 保持业务逻辑的稳定性
下次当你发现自己在重复编写相同的复杂SQL时,不妨考虑创建一个视图,让代码更简洁高效!
(注:本文示例基于Oracle 21c语法,部分特性在旧版本可能略有差异)
本文由 源娴静 于2025-08-04发表在【云服务器提供商】,文中图片由(源娴静)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/530953.html
发表评论