12:视图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
六、TOP-N
八、数据字典与动态性能视图
第一节什么是视图
一、创建视图:
创建视图的主法是:CREATE [OR REPLACE] VIEW 视图名AS 查询语句。例如,如下语句就创建了一个视图:
sid=41 pid=17> create view ydsp_v1 as select nvl(spbh,'待定') spbh,sum(nvl(jg,0)) sum from ydsp group by spbh;
视图已创建。
视图的名字是YDSP_V1。
哪么,它有什么用呢?很简单,如果以后你再想查看SPBH(商品编号)对JG(价格)列进行分组求和的结果,不必再使用“select nvl(spbh,'待定') spbh,sum(nvl(jg,0)) sum from ydsp group by spbh; ”,直接SELECT 视图即可:
sid=41 pid=17> select * from ydsp_v1;
SPBH SUM
---- ----------
101 43500
待定0
102 6000
201 9800
202 9800
这样比你每次输入分组查询简单一些。我们可以将常用的比较复杂的查询操作像上面这样,建立为视图。这样每次查询视图就可看到结果,比输入复杂查询语句更省事。
创建视图命令中的[OR REPLACE]的意义,REPLACE有替换的意思。它的主要作用是修改视图的定义,也就是修改视图内的SQL语句。比如说上面的YDSP_V2,我想为YDSP_V2中增加一个COUNT(*),命令如下:create or replace view ydsp_v1 as select nvl(spbh,'待定') spbh,sum(nvl(jg,0)),count(*) CT sum from ydsp group by spbh;
这个命令非常简单,我不再试了。这条命令的意思是把YDSP_V1再创建一次。用新的YDSP_V1替代老的YDSP_V1,也就是重建视图。视图在创建后,它的结构、定义等信息不能修改,要想改变视图的定义信息,只能使用CREATE OR REPLACE,用新的定义重建视图。
在创建视图时,对这种使用各种函数,或运算表达式的列,一定要起别名,如没有别名视图创建就会失败,例如:
sid=41 pid=17> create view ydsp_v1 as select nvl(spbh,'待定') ,sum(nvl(jg,0)) SUM from ydsp group by spbh;
create view ydsp_v1 as select nvl(spbh,'待定') ,sum(nvl(jg,0)) SUM from ydsp group by spbh
*
第 1 行出现错误:
ORA-00998: 必须使用列别名命名此表达式
我把NVL()函数后的别名去掉了,创建失败。ORACLE报出的错误,就是说“我在这里缺少列的别名”。
为什么一定要为列起别名,因为一个创建好的视图,就像一个表一样,就像我们刚开始所举的例子,它有两个列:SPBH和SUM。用户可以通过select spbh,sum from ydsp_v1来显示这两个列中的数据。像nvl(spbh,'待定')这样的表达式,如果你没有指定别名的话,ORACLE将无法确定在视图中,它的列名是什么。因此,在创建视图时,对于这种复杂的表达式,一定要为它起别名。
当使用SELECT查询一个视图时,和查询表是一某一样的,我们就可以把视图当表一样去查询。SELECT 语句中,所有适用于表特性,都同样适用性视图。比如我们可以增长条件:
sid=41 pid=17> select * from ydsp_v1 where spbh<>'待定';
SPBH SUM
---- ----------
101 43500
102 6000
201 9800
202 9800
显示YDSP_V1视图中,SPBH(商品编号)列不等于“待定”的行。在使用这个命令时,我们完全可以把YDSP_V1当作一个表,它有5行,两列,列名分别是SPBH和SUM。视图数据的来源,被称为视图的“基表”。视图的基表可以有多个。如果我根据连接命令创建一个视图,那么这个视图中的数据可能来自于多个表,这样它就有了多个基表。
基表中的数据变化时,视图也会跟着发生变化。例如,在YDSP表中我再插入一行:
sid=41 pid=17> insert into ydsp values('020-0003','201','2008-06-05',9800,'测试中');
已创建1 行。
sid=41 pid=17> commit;
提交完成。
我又为201号商品增加了一行。下面我再显示一下视图:
sid=41 pid=17> select * from ydsp_v1;
SPBH SUM
---- ----------
101 43500
待定0
102 6000
201 19600
202 9800
201号商的销售总额已经是19600了。也就是说,基表发生了什么变化,不需要任何操作,视图马上就可以反应出来。
这就是视图,我们先不深入的讨论它,仅从外观看,是看不出它和表有什么区别的。在SELECT时,你根据看不出来你SELECT的是一个表,还是一个视图。其实很多时候,我们都在SELECT视图,但是我们都以为在SELECT表。
我们还可以以视图为基表,再创建视图,比如上面的例子,我想把显示结果中的SPBH(商品编号),换成商品的型号,这需要和SP表等值连接起来显示:
sid=41 pid=17> select xh,sum from ydsp_v1 a , sp b where a.spbh=b.spbh;
XH SUM
--------------- ----------
至尊型43500
平民型6000
商务型19600
个人型9800
连接的命令还是稍有点长的,下面我根据此命令,再创建一个视图:
sid=41 pid=17> create view ydsp_sp_v1 as select xh,sum from ydsp_v1 a , sp b where a.spbh=b.spbh;
视图已创建。
视图的名字是YDSP_SP_V1,名字是根据需要随变定的,如果觉得我这个复杂,可以换成简单的,主要是我想当我看到这个名字时,就能知道这个视图涉及两个表YDSP和SP。
好了,下面我们显示一下这个视图,它的输出结果,将和上面的那条连接SELECT语句一样:
sid=41 pid=17> select * from ydsp_sp_v1;
XH SUM
--------------- ----------
至尊型43500
平民型6000
商务型19600
个人型9800
这样,以后无论哪种型号的商又被定购,如果我想查看种型号的定购总额。直接查看这个视图就行了。
这个视图的基表有SP表和YDSP_V1视图,而YDSP_V1的基表是YDSP表。也就是说一个视图可以作为