现在的位置: 首页 > 综合 > 正文

sql之视图管理

2018年05月20日 ⁄ 综合 ⁄ 共 3645字 ⁄ 字号 评论关闭

1:创建视图

      create view view_name[(column)]

        [with encryption]

       as

       select_statement

       [with checkoption]

      

       with encryption:指定将create view语句文本存储到系统表时进行加密,加密后,任何人都不能通过系统存储过程中其他方法从系统表中检索视图定义文本

       with check option:规定在视图上执行的所有数据修改语句都必须符合由select_statement设置的准则,通过视图修改数据记录,with check option可以确保

提交修改后,仍可通过视图看到修改的数据。

  

       在create view语句创建视图时,不能引用临时表,不能再查询语句中包含order by、compute、computer by 或者into关键字

2:单表视图

  

create view db_view1 
as 
select 仓库号, 城市,面积 from 仓库

create view db_view2 
as 
select 姓名,工资,工资*0.1 as 奖金, (工资-800)*0.15 as 所得税,
  (工资 + (工资-800)*0.15 - (工资-800)*0.15) as 实发工资 from 职工

3:多表视图

    

create view db_view3
as 
select 仓库.仓库号, 城市, 面积, 创建时间, 姓名, 性别, 工资 from 仓库,职工
  where 仓库.仓库号=职工.仓库号
  

4:创建带有聚合函数的视图

create view db_view4
as 
select 仓库号, 职工号, 姓名, 工资, (select AVG(工资) from 职工) as 所有员工的平均工资 from 职工

5:基于视图的视图

    如果想创建这样一个视图:实现统计职工所在仓库的仓库号,城市,面积,平均面积,最大面积,最小面积,面积和,还要统计职工的姓名,性别,工资,平均工资,

最大工资,最小工资,工资和,不同仓库的平均工资,最大工资,最小工资,工资和,还要统计职工所销售的金额,平均金额,最大金额,最小金额,金额和,不同职工的

最大金额,最小金额,平均金额,金额和信息

  如果直接创建一个视图,select语句会非常长,这时可以先创建仓库视图(统计仓库面积信息), 职工视图(统计职工工资信息),订购单视图(统计职工的销售金额信息),

然后利用这3个视图再创建一个试图,实现上述功能。

   实现仓库视图,统计仓库面积信息,实现代码如下:

  

create view 仓库视图
as
select 仓库号,城市, 面积, 创建时间, (select AVG(面积) from 仓库) as 平均面积,
(select MAX(面积) from 仓库) as 最大面积, (select MIN(面积) from 仓库) as 最小面积,
(select SUM(面积) from 仓库) as 面积和 
from 仓库 

select * from 仓库视图;

实现职工视图,统计职工工资信息

 

create view 职工视图
as
select 仓库号, 职工号, 姓名, 性别, 工资,
(select AVG(工资) from 职工) as 平均工资,
(select MAX(工资) from 职工) as 最大工资,
(select MIN(工资) from 职工) as 最小工资,
(select SUM(工资) from 职工) as 工资和,
(select AVG(工资) from 职工 where 仓库号=a.仓库号) as 不同仓库的平均工资,
(select SUM(工资) from 职工 where 仓库号=a.仓库号) as 不同仓库的工资和,
(select MAX(工资) from 职工 where 仓库号=a.仓库号) as 不同仓库的最大工资,
(select MIN(工资) from 职工 where 仓库号=a.仓库号) as 不同仓库的最小工资

from 职工 a

select * from 职工视图

创建订购单视图,统计职工的销售金额信息

create view 订购单视图
as 
select 职工号, 订购日期, 金额, 
  (select AVG(金额) from 订购单) as 平均金额,
  (select MAX(金额) from 订购单) as 最大金额,
  (select MIN(金额) from 订购单) as 最小金额,
  (select AVG(金额) from 订购单 where 职工号=a.职工号) as 不同职工的平均金额,
  (select MAX(金额) from 订购单 where 职工号=a.职工号) as 不同职工的最大金额,
  (select MIN(金额) from 订购单 where 职工号=a.职工号) as 不同职工的最小金额,
  (select SUM(金额) from 订购单 where 职工号=a.职工号) as 不同职工的金额和
from 订购单 a
 

select * from 订购单视图

创建基于视图的视图,解决刚才的问题:

 

create view 基于视图的视图
as
select 仓库视图.仓库号,  城市, 面积, 平均面积, 最大面积, 最小面积, 面积和,
       姓名, 性别, 工资, 平均工资, 最大工资, 最小工资, 
       不同仓库的平均工资, 不同仓库的最大工资, 不同仓库的最小工资, 不同仓库的工资和,
       订购单视图.职工号, 订购日期, 金额, 平均金额, 最大金额, 最小金额,
       不同职工的平均金额, 不同职工的最大金额, 不同职工的最小金额, 不同职工的金额和
from 仓库视图, 职工视图, 订购单视图
where 仓库视图.仓库号=职工视图.仓库号 and 订购单视图.职工号=职工视图.职工号

select * from 基于视图的视图

6:创建带有分组功能的视图

  

create view 不同城市工资统计信息视图
as
select 城市,AVG(工资) as 不同城市平均工资, MAX(工资) as 不同城市最大工资
from 基于视图的视图 group by 城市;

select * from 不同城市工资统计信息视图

7:创建与数据库表字段不同的视图

create view db_view8(职工姓名, 职工月工资)
as
select 姓名, 工资 from 职工
select * from db_view8

8:创建加密视图

    

create view 加密视图
with encryption
as
select 仓库号, 面积, 城市 from 仓库

9:修改视图

   使用alter view关键字来进行修改视图

10:删除视图

     使用drop view关键字来删除视图

11:带有判断条件的删除视图

    视图创建成功后,其类型标识为v,这些信息都保存在master系统数据库的sysobjects表中,利用sysobjects表即可判断指定的视图是否存在。

  

if Exists(select * from  sysobjects where name='db_view' and xtype='v')
   begin
      print '要删除的视图存在'
      drop view db_view
   end
else 
  print '要删除的视图不存在'

12:带有条件和排序的分组查询

     

select 仓库号,COUNT(仓库号) as 职工人数, AVG(工资) as 平均工资, AVG(金额) as 平均销售金额 from 基于视图的视图  
where 工资>500 group by 仓库号  having COUNT(仓库号)>5 order by 平均销售金额 desc
 

对视图优缺点的描述:

优点:

   *简化操作

     视图大大简化了用户对数据的操作,在定义视图时,视图本身就是一个复杂查询的结果集,每次执行相同的查询时,不必重写这些复杂的查询语句,只需要简单的

一条查询视图语句,视图隐藏了表和表之间的复杂的连接关系。

   *定制数据

     视图能够实现让不同的用户以不同的方式看到不同或者相同的数据集的功能,因为当有许多不同的用户共享一个数据库时,这显得极为重要。

   *合并分割数据

     在有些情况下,由于表中的数据量太大,在设计表时常常将表进行水平分割或者垂直分割,但表的结构的变化却能对应用程序产生不良影响。

如果使用视图则可以保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。

    *安全性

    视图具有一种安全机制,通过视图用户只能查看和修改他们能看到的数据,其他数据表既不可见也不可访问,如果某一用户想要访问视图的结果集,必须

被授予访问权限,视图所引用表的访问权限和视图权限设置互不影响

缺点:

    *性能不高

    虽然在查询数据使,表和视图的功能相同,但是数据库管理系统DBMS处理对视图的查询时,必须要先将其转换为对底层源表的查询,如果视图的定义采用一个

相当复杂的多表查询语句,那么对视图的一个简单查询,转换后实际上是一个很复杂的查询联系体。相比对一个实际表做一个查询,视图可能需要的时间会更长。

    *数据修改受限
    对视图进行插入、更新、删除操作时,DBMS必须要将该操作请求转换为对表的数据的操作,对一个简单的单表视图而言,这些操做是可以实现的,但是对于复杂

的视图,就不能顺利的进行更新。所以,对于复杂的视图而言,其中定义的数据一般是只读的。

  

【上篇】
【下篇】

抱歉!评论已关闭.