D7

常见的数据库对象

对象 描述
基本的数据存储集合,由行和列组成
视图 从表中抽出的逻辑上相关的数据集合
序列 提供有规律的数值
索引 提高查询的效率
同义词 给对象起别名

 

视图

为什么使用视图

1)控制数据访问

2)简化查询

3)数据独立性

4)避免重复访问相同的数据

 

视图的分类

 

特性 简单视图 复杂视图
表的数量 一个 一个或多个
函数 没有
分组 没有
DML操作 可以 有时可以

 

创建视图CREATE VIEW

可以在CREATE VIEW语句中嵌入子查询,子查询可以是很复杂的SELECT语句。

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
    [(alias[, alias]...)]
    AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];

示例:

CREATE VIEW empvu80
  AS 
  SELECT employee_id, employee_name, salary
  FROM employees
  WHERE department_id = 1;

查看定义:

DESCRIBE empvu80;

 

创建视图时在子查询中给列定义别名,在选择视图中的列时,应使用别名。

CREATE VIEW emp_salvu50
    AS
    SELECT employee_id ID_NUMBER, employee_name NAME, salary*12 ANN_SALARY
    FROM employees
    WHERE department_id = 1;

 

查询视图

SELECT *
FROM emp_salvu50;
ID_NUMBER NAME ANN_SALARY
1 Alice 120000
2 Bob 60000

注:查询时,Oracle Server先找到视图,然后通过视图查询对应的表,得到数据。另可以看到查询出的列使用的是别名。

 

修改视图

使用CREATE OR REPLACE VIEW子句修改视图,

CREATE VIEW子句中各列的别名应和子查询中各列相对应。

CREATE OR REPLACE VIEW empvu80
  (id_number, name, sal, department_id)
  AS 
  SELECT employee_id, employee_name, salary, department_id
  FROM employees
  WHERE department_id = 1;

查询:

SELECT * 
FROM empvu80;
ID_NUMBER NAME SAL DEPARTMENT_ID
1 Alice 10000 1
2 Bob 5000 1

注:已经修改了列。

 

创建复杂视图

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;

注:复杂视图:涉及多个表、使用了分组函数、分组等。

查询:

SELECT * 
FROM dept_sum_vu;
NAME MINSAL MAXSAL AVGSAL
Development 5000 10000 7500
Qulity 10000 10000 10000
Trade 4000 8000 6000

 

视图中使用DML

规定

当视图定义中包含以下元素之一时不能使用insert :
1)组函数
2)GROUP BY子句
3)DISTINCT关键字
4)ROWNUM伪列
5)列的定义为表达式
6)表中非空的列在视图定义中未包括

 

当视图定义中包含以下元素之一时不能使用update :
1)组函数
2)GROUP BY子句
3)DISTINCT关键字
4)ROWNUM伪列
5)列的定义为表达式

 

WITHCHECKOPTION子句

使用WITH CHECK OPTION子句确保DML只能在特定的范围内执行,任何违反WITH CHECK OPTION约束的请求都会失败。

CREATE OR REPLACE VIEW empvu20
  AS 
  SELECT *
  FROM employees
  WHERE department_id = 20
  WITH CHECK OPTION CONSTRAINT empvu20_ck ;

注:这里的约束在哪里定义?

 

屏蔽DML 操作

可以使用WITH READ ONLY选项屏蔽对视图的DML操作,
任何DML操作都会返回一个Oracle server错误。

CREATE OR REPLACE VIEW empvu10
  (employee_number, employee_name, job_title)
  AS 
  SELECT employee_id, employee_name, job_id
  FROM employees
  WHERE department_id = 10
  WITH READ ONLY;

注:这里如何使用?

 

删除视图

删除视图只是删除视图的定义,并不会删除基表的数据。

语法:

DROP VIEW view_name;

示例:

DROP VIEW empvu80;

 

临时视图

临时视图可以是嵌套在SQL语句中的子查询,在FROM子句中的的子查询是临时视图,

临时视图不是数据库对象。

 

Top-N分析

Top-N分析查询一个列中最大或最小的n个值:
如:
销售量最高的十种产品是什么?
销售量最差的十种产品是什么?
Top-N分析关心的是最大和最小的值的集合。

SELECT [column_list], ROWNUM 
FROM (SELECT [column_list] 
      FROM table
      ORDER BY Top-N_column)
WHERE ROWNUM <= N;

示例:

SELECT ROWNUM as RANK, employee_name, salary 
FROM (SELECT employee_name,salary 
      FROM employees
      ORDER BY salary DESC)
WHERE ROWNUM <= 3;
RANK EMPLOYEE_NAME SALARY
1 Gina 12000
2 Alice 10000
3 Elsa 8000

 

总结:

本节介绍视图和TOP-N分析:

1)视图:创建CREATE VIEW、更新CREATE OR REPLACE VIEW、删除DROP VIEW等;

2)视图中使用:DML语句的规则、WITH CHECK OPTION(确保DML使用范围)、WITH READ ONLY(屏蔽DML使用)。

3)TOP-N分析:获取最大或最小的N个值的集合。

 

版权声明:本文为workingdiary原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/workingdiary/articles/13328215.html