关于视图

来源:互联网 发布:python编码格式转换 编辑:程序博客网 时间:2024/05/29 04:13

  


   视图-是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。视图的本质是一条select语句。

下面的例子有一个简单的例子:

在oracle中创建有下面视图:



create or replace view v_ms_receiveconductdet as
(
  select r.freceiveconductid,
         r.fuseplanid,
         r.fuserplanno,
         r.fuseplandetid,
         r.fpid,
         r.fmaterialid,
         r.fmaterialcode,
         r.Fmaterialname,
         r.fmaterialmodel,
         r.fdrawingno,
         r.fmaterialunit,
         r.fbinid,
         r.fbinno,
         r.fbin,
         r.fbatch,
         r.fcosting,
         r.fusedstatus,
         r.foutnum - nvl(v.unvaliableNum, 0) as avaliableNum,
         r.foutnum - nvl(v.unvaliableNumb, 0) as avaliableNumb,
         r.fdifcosting
    from t_ms_receiveconductdet r
    left join (select v.foreceiveconductid,
                      v.fuseplanid,
                      v.fuseplandetid,
                      v.fmaterialid,
                      v.fbatch,
                      sum(v.unvaliableNum) as unvaliableNum,
                      sum(v.unvaliableNumb) as unvaliableNumb
                 from v_ms_reconductchargeunvaliable v

                group by v.foreceiveconductid,
                         v.fuseplanid,
                         v.fuseplandetid,
                         v.fmaterialid,
                         v.fbatch) v
      on r.fmaterialid = v.fmaterialid
     and r.fbatch||'-1' = v.fbatch||'-1'
     and r.freceiveconductid = v.foreceiveconductid,
   t_ms_receiveconduct t

   where r.freceiveconductid = t.fpid
     and (t.fstatus = 7)
     and t.fsign = '蓝单'

);


create or replace view v_ms_reconductchargeunvaliable as
(
       select t.foreceiveconductid,
       r.fuseplanid,
       r.fuseplandetid,
       r.fmaterialid,
       r.fbatch,
       b.fbinid,
       sum(r.frecnum) as unvaliableNum, --不使用库位
       sum(b.foutnum) as unvaliableNumb --使用库位
  from t_ms_receiveconductdet r
  left join t_ms_receiveconduct t
    on t.fpid = r.freceiveconductid
  left join t_ms_recebindet b
    on b.receiveconductdetid = r.fpid

 where t.fuse = '红冲出库'
   and t.fstatus = 0

 group by t.foreceiveconductid,
          r.fuseplanid,
          r.fuseplandetid,
          r.fmaterialid,
          r.fbatch,
          b.fbinid
union all --审批
 (select t.foreceiveconductid,
         r.fuseplanid,
         r.fuseplandetid,
         r.fmaterialid,
         r.fbatch,
         b.fbinid,
         sum(r.fapprovenum) as unvaliableNum,
         sum(b.foutnum) as unvaliableNumb
    from  t_ms_receiveconductdet r
  left join t_ms_recebindet b
    on b.receiveconductdetid = r.fpid
  left join t_ms_receiveconduct t
    on t.fpid = r.freceiveconductid
   where   t.fuse = '红冲出库'
     and (t.fstatus = 2 or t.fstatus = 3 or t.fstatus = 4)
   group by t.foreceiveconductid,
            r.fuseplanid,
            r.fuseplandetid,
            r.fmaterialid,
            r.fbatch,
            b.fbinid
            )
union all --已记账
 (select t.foreceiveconductid,
         r.fuseplanid,
         r.fuseplandetid,
         r.fmaterialid,
         r.fbatch,
         b.fbinid,
         sum(r.foutnum) as unvaliableNum,
         sum(b.foutnum) as unvaliableNumb
    from  t_ms_receiveconductdet r
     left join t_ms_recebindet b
    on b.receiveconductdetid = r.fpid
     left join t_ms_receiveconduct t
    on t.fpid = r.freceiveconductid


   where   t.fuse = '红冲出库'
     and t.fstatus = 7
   group by t.foreceiveconductid,
            r.fuseplanid,
            r.fuseplandetid,
            r.fmaterialid,
            r.fbatch,
            b.fbinid
            )
       );


如果要在mysql里面创建视图的话,mysql是允许有子查询的。

但是你可以通过中间视图来进行连接。

就像如下这样:

create or replace view v_ms_receiveconductdet as
(
  select r.freceiveconductid,
         r.fuseplanid,
         r.fuserplanno,
         r.fuseplandetid,
         r.fpid,
         r.fmaterialid,
         r.fmaterialcode,
         r.Fmaterialname,
         r.fmaterialmodel,
         r.fdrawingno,
         r.fmaterialunit,
         r.fbinid,
         r.fbinno,
         r.fbin,
         r.fbatch,
         r.fcosting,
         r.fusedstatus,
         r.foutnum - IFNULL(v.unvaliableNum,0) as avaliableNum,
         r.foutnum - IFNULL(v.unvaliableNumb,0) as avaliableNumb,
         r.fdifcosting
    from t_ms_receiveconductdet r
    left join ( v_ms_reconductchargeunvaliable v   )
      on r.fmaterialid = v.fmaterialid
     and r.fbatch||'-1' = v.fbatch||'-1'
     and r.freceiveconductid = v.foreceiveconductid,
   t_ms_receiveconduct t

   where r.freceiveconductid = t.fpid
     and (t.fstatus = 7)
     and t.fsign = '蓝单'

);





create or replace view v_ms_reconductchargeunvaliable as

       select t.foreceiveconductid,
       r.fuseplanid,
       r.fuseplandetid,
       r.fmaterialid,
       r.fbatch,
       b.fbinid,
       sum(r.frecnum) as unvaliableNum,
       sum(b.foutnum) as unvaliableNumb
  from t_ms_receiveconductdet r
  left join t_ms_receiveconduct t
    on t.fpid = r.freceiveconductid
  left join t_ms_recebindet b
    on b.receiveconductdetid = r.fpid

 where t.fuse = '红冲出库'
   and t.fstatus = 0

 group by t.foreceiveconductid,
          r.fuseplanid,
          r.fuseplandetid,
          r.fmaterialid,
          r.fbatch,
          b.fbinid
union all
 select t.foreceiveconductid,
         r.fuseplanid,
         r.fuseplandetid,
         r.fmaterialid,
         r.fbatch,
         b.fbinid,
         sum(r.fapprovenum) as unvaliableNum,
         sum(b.foutnum) as unvaliableNumb
    from  t_ms_receiveconductdet r
  left join t_ms_recebindet b
    on b.receiveconductdetid = r.fpid
  left join t_ms_receiveconduct t
    on t.fpid = r.freceiveconductid
   where   t.fuse = '红冲出库'
     and (t.fstatus = 2 or t.fstatus = 3 or t.fstatus = 4)
   group by t.foreceiveconductid,
            r.fuseplanid,
            r.fuseplandetid,
            r.fmaterialid,
            r.fbatch,
            b.fbinid
            
union all
 select t.foreceiveconductid,
         r.fuseplanid,
         r.fuseplandetid,
         r.fmaterialid,
         r.fbatch,
         b.fbinid,
         sum(r.foutnum) as unvaliableNum,
         sum(b.foutnum) as unvaliableNumb
    from  t_ms_receiveconductdet r
     left join t_ms_recebindet b
    on b.receiveconductdetid = r.fpid
     left join t_ms_receiveconduct t
    on t.fpid = r.freceiveconductid


   where   t.fuse = '红冲出库'
     and t.fstatus = 7
   group by t.foreceiveconductid,
            r.fuseplanid,
            r.fuseplandetid,
            r.fmaterialid,
            r.fbatch,
            b.fbinid
            

这样做的你可以明确的理解视图额本质是一条select语句的含义。

先明确怎么做,在明确它的功能也许会更清楚,视图的功能介绍:

1、视图能简化用户操作
    视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐藏起来了。换句话说,用户所作的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。
2、 视图使用户能以多种角度看待同一数据
    视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。
3、 视图对重构数据库提供了一定程度的逻辑独立性
    数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。
在关许数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系Student(Sno,Sname,Ssex,Sage,Sdept),
分为SX(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)两个关系。这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:
CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)
AS
SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept
FROM SX,SY
WHERE SX.Sno=SY.Sno;
    这样尽管数据库的逻辑结构改变了(变为SX和SY两个表了),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。
当然,视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。
4、视图能够对机密数据提供安全保护
    有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应该看到这些数据的用户视图上。这样视图机制就自动提供了对机密数据的安全保护功能。例如,Student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本原系学生视图。
5、适当的利用视图可以更清晰地表达查询
    例如经常需要执行这样的查询“对每个学生找出他获得最高成绩的课程号”。可以先定义一个视图,求出每个同学获得的最高成绩:
CREATE VIEW VMGRADE
AS
SELECT Sno,MAX(Grade) Mgrade
FROM SC
GROUP BY Sno;
然后用如下的查询语句完成查询:
SELECT SC.Sno,Cno FROM SC,VMGRADE WHERE SC.Sno = VMGRADE.Sno AND SC.Grade = VMGRADE.Mgrade;
    




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 1岁宝宝挑食怎么办 宝宝不愿意开口说话怎么办 自闭症孩子不爱学习怎么办 宝宝不独立走路怎么办 六个月宝宝不认人怎么办 小孩隔奶奶涨怎么办 小孩段奶奶涨怎么办 1岁半还不会说话怎么办 孩子嗓子哑了怎么办 小朋友嗓子哑了怎么办 4周岁宝宝拉肚子怎么办 小孩不肯拉小便怎么办 做销售不爱说话怎么办 我伤害了朋友怎么办 三岁发音不准怎么办 心里憋不住话怎么办 自己不长记性怎么办 孩子不愿意开口说话怎么办 孩子不爱开口说话怎么办 宝宝犟脾气不好怎么办 小孩说话不算话怎么办 孩子说话不算话怎么办 孩子故意不好好说话怎么办 小孩说话吐字不清楚怎么办 腿老是抽筋是怎么办 半夜睡觉脚抽筋怎么办 我不爱说话内向怎么办 小孩子吐字不清怎么办 宝宝前边头发少怎么办 宝宝咬嘴唇龅牙怎么办 小孩老是咬下唇怎么办 五月小孩掉下床怎么办 小孩说话夹舌头怎么办 小孩自闭不说话怎么办 孩子突然不说话怎么办 孩子说话语速慢怎么办 做磁共振不睡觉怎么办 宝宝吃饭不多怎么办 孩子吃饭爱说话怎么办 孩子吃饭喜欢说话怎么办 小孩子讲话嘴巴歪怎么办