~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:Oracle sql*plus PLSQL Developer
作者:陈小白
撰写时间:2019年03月25日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
视图:
视图是数据库对象的一种,是从表中抽出的逻辑上相关的数据集合。
视图是一种虚表。
视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句.
视图向用户提供基表数据的另一种表现形式
为什么使用视图?
控制数据访问
简化查询
避免重复访问相同的数据
简单的视图和复杂的视图
特性 |
简单视图 |
复杂视图 |
表的数量 |
一个 |
一个或多个 |
函数 |
没有 |
有 |
分组 |
没有 |
有 |
DML操作 |
可以 |
有时可以 |
创建视图
在 CREATE VIEW 语句中嵌入子查询
创建视图时在子查询中给列定义别名
REATE VIEW (视图名)AS子查询
CREATE VIEW STUS001
AS SELECT SNO,NAME,CLASS
FROM STU2
WHERE CLASS=’17-01’;
查询视图
SELECT *
FROM STUS001;
修改视图
使用CREATE OR REPLACE VIEW 子句修改视图
CREATE VIEW 子句中各列的别名应和子查询中各列相对应
CREATE OR REPLACE VIEW STUS001
(SNO,NAME,CLASS) AS
SELECT SNO,NAME||’ IS ’||SSEX,CLASS
FROM STU2
WHERE CLASS=’17-01’;
执行成功后,查询
视图中使规用DML的规定:可以在简单视图中执行 DML 操作
1.当视图定义中包含以下元素之一时不能使用update:
组函数
GROUP BY子句
DISTINCT 关键字
ROWNUM 伪列
列的定义为表达式
当视图定义中包含以下元素之一时不能使用delete:
组函数
GROUP BY 子句
DISTINCT 关键字
ROWNUM 伪列
当视图定义中包含以下元素之一时不能使insert:
组函数
GROUP BY 子句
DISTINCT 关键字
ROWNUM 伪列
列的定义为表达式
表中非空的列在视图定义中未包括
屏蔽DML操作
可以使用 WITH READ ONLY 选项屏蔽对视图的DML 操作
任何 DML 操作都会返回一个Oracle server 错误
CREATE OR REPLACE VIEW STUS001
(SNO,NAME,CLASS) AS
SELECT SNO,NAME||’ IS ’||SSEX,CLASS
FROM STU2
WHERE CLASS=’17-01’
WITH READ ONLY;
删除视图:DROP VIEW (视图名)
删除视图只是删除视图的定义,并不会删除基表的数据
DROP VIEW STUS001;
Top-N 分析:ROWNUM
Top-N 分析查询一个列中最大或最小的 n 个值:
成绩最高的两名同学的学号?
成绩最差的两名同学的学号?
最大和最小的值的集合是 Top-N 分析所关心的
说明: rownum "伪列" 数据表本身并没有这样的列, 是 oracle 数据库为每个数据表 "加上的"列.
可以标识行号.默认情况下 rownum 按主索引来排序. 若没有主索引则自然排序.
注意:
对 ROWNUM 只能使用 < 或 <=, 而用 =, >, >= 都将不能返回任何数据。
应用:成绩最高的两名同学的学号? 成绩最差的两名同学的学号?
SELECT ROWNUM,SNO,DEGREE
FROM (SELECT SNO,DEGREE
FROM SCORE
ORDER BY DEGREE DESC)
WHERE ROWNUM<=2;
查询排在第2到第10名同学的学号和成绩
SELECT *
FROM (SELECT ROWNUM RN,SNO,DEGREE
FROM (SELECT SNO,DEGREE
FROM SCORE
ORDER BY DEGREE DESC))
WHERE RN >=2 AND RN <=10;