Oracle系列十三 视图
2024-09-06 07:37:21
视图 :从表中抽出的逻辑上相关的数据集合。
- 视图是一种虚表。
- 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
- 向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句.
- 视图向用户提供基表数据的另一种表现形式
为什么使用视图
- 控制数据访问
- 简化查询
- 避免重复访问相同的数据
简单视图和复杂视图
创建视图
- 在 CREATE VIEW 语句中嵌入子查询
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
- 子查询可以是复杂的 SELECT 语句
CREATE OR REPLACE VIEW empview AS
SELECT
employee_id emp_id,
last_name name,
department_name
FROM
employees e,
departments d
WHERE
e.department_id = d.department_id
- 描述视图结构
DESCRIBE empvu80
- 创建视图时在子查询中给列定义别名
CREATE VIEW salvu50 AS
SELECT
employee_id id_number,
last_name name,
salary * 12 ann_salary
FROM
employees
WHERE
department_id = 50;
注:在选择视图中的列时应使用别名
查询视图
SELECT
*
FROM
salvu50;
修改视图
- 使用CREATE OR REPLACE VIEW 子句修改视图
- CREATE VIEW 子句中各列的别名应和子查询中各列相对应
CREATE OR REPLACE VIEW empvu80 (
id_number,
name,
sal,
department_id
) AS
SELECT
employee_id,
first_name
|| ' '
|| last_name,
salary,
department_id
FROM
employees
WHERE
department_id = 80;
创建复杂视图
CREATE VIEW dept_sum_vu (
name,
minsal,
maxsal,
avgsal
) AS
SELECT
d.department_name,
MIN(e.salary),
MAX(e.salary),
AVG(e.salary)
FROM
employees e,
departments d
WHERE
e.department_id = d.department_id
GROUP BY
d.department_name;
视图中使用DML的规定
- 可以在简单视图中执行 DML 操作
- 当视图定义中包含以下元素之一时不能使用delete:
- 组函数
- GROUP BY 子句
- DISTINCT 关键字
- ROWNUM 伪列
CREATE OR REPLACE VIEW sal_view AS
SELECT
AVG(salary) avg_sal
FROM
employees
GROUP BY
department_id
- 当视图定义中包含以下元素之一时不能使用update:
- 组函数
- GROUP BY子句
- DISTINCT 关键字
- ROWNUM 伪列
- 列的定义为表达式
- 当视图定义中包含以下元素之一时不能使insert:
- 组函数
- GROUP BY 子句
- DISTINCT 关键字
- ROWNUM 伪列
- 列的定义为表达式
- 表中非空的列在视图定义中未包括
屏蔽 DML 操作
- 可以使用 WITH READ ONLY 选项屏蔽对视图的DML 操作
- 任何 DML 操作都会返回一个Oracle server 错误
CREATE OR REPLACE VIEW empvu10 (
employee_number,
employee_name,
job_title
) AS
SELECT
employee_id,
last_name,
job_id
FROM
employees
WHERE
department_id = 10
WITH READ ONLY;
删除视图
- 删除视图只是删除视图的定义,并不会删除基表的数据
DROP VIEW view;
DROP VIEW empvu80;
Top-N 分析
- Top-N 分析查询一个列中最大或最小的 n 个值:
- 销售量最高的十种产品是什么?
- 销售量最差的十种产品是什么?
- 最大和最小的值的集合是 Top-N 分析所关心的
查询最大的几个值的 Top-N 分析:
SELECT [column_list], ROWNUM
FROM (SELECT [column_list]
FROM table
ORDER BY Top-N_column)
WHERE ROWNUM <= N;
注意: 对 ROWNUM 只能使用 < 或 <=, 而用 =, >, >= 都将不能返回任何数据
示例:查询工资最高的三名员工:
SELECT
ROWNUM AS rank,
last_name,
salary
FROM
(
SELECT
last_name,
salary
FROM
employees
ORDER BY
salary DESC
)
WHERE
ROWNUM <= 3;
示例
SELECT
*
FROM
(
SELECT
ROWNUM rn,
employee_id,
salary
FROM
(
SELECT
employee_id,
salary,
last_name
FROM
employees
ORDER BY
salary DESC
)
)
WHERE
rn <= 50
AND rn > 40;
最新文章
- 微信H5中的一些坑
- LeetCode OJ String to Integer (atoi) 字符串转数字
- centos 6.5 下载
- 比较IE6的不同之处,与IE8 IE11 比较
- Android java.lang.UnsupportedClassVersionError: com/android/dx/command/Main : Unsupported major.minor ver
- cocos2dx中的设计分辨率与屏幕适配策略
- struts2基于Convention插件的约定映射使用
- TableView的优化
- Android -- onMeasure()源码分析
- super 与 this 同时使用问题
- JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块
- kubernetes进阶之四:Label和Label Selector
- 文件内容统计:对任意给定的.txt文件进行内容的字符数、行数、单词数进行统计
- 清空库数据sql
- python入门-python处理csv文件格式相关
- 七、Builder 建造器模式
- 20155226《网络攻防》 Exp3 免杀原理与实践
- L1-034 点赞
- Windows下如何正确下载并安装可视化的Redis数据库管理工具(redis-desktop-manager)(图文详解)
- shell和awk配合使用