SQL学习十五、视图

视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索 数据的查询。
可以把视图看作一个已经写好的SQL,使用的时候直接调用对应的视图以获取对应的数据。

备注:
1、MySQL从版本 5起开始支持视图,因此,视图不能在较早版本的 MySQL中使用。
2、SQLite仅支持只读视图,所以视图可以创建,可以读,但其内容不能更改。


为什么使用视图

1、重用 SQL语句,视图可以给多人使用,而不用重复书写相同的SQL;
2、简化复杂的 SQL操作。在编写查询后,可以方便地重用它而不必知道 其基本查询细节;
3、使用表的一部分而不是整个表;
4、保护数据。可以授予用户访问表的特定部分的权限,而不是整个表的 访问权限;
5、更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。

创建视图之后,可以用与表基本相同的方式使用它们。
可以对视图执行 SELECT 操作,过滤和排序数据,将视图联结到其他视图或表。


视图的性能问题

因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时 需要的所有检索。如果你用多个联结和过滤创建了复杂的视图或者嵌 套了视图,性能可能会下降得很厉害。


视图的规则和限制

1、与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字);
2、创建视图的数目没有限制;
3、视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造视图,嵌套的层级在不同的DBMS中有不同的限制;
4、许多 DBMS禁止在视图查询中使用 ORDER BY 子句;
5、有些 DBMS把视图作为只读的查询;
6、在创建视图前应该阅读相关的DBMS文档。


创建视图 CREATE VIEW

使用CREATE VIEW 进行视图的创建,我们将前面的查询国家内业图斑中图斑面积大于10亩的的图斑分别拥有的附件数量的SQL,用视图保存,然后利用视图进行查询

  • 左外联结的SQL
select SR.TBBH, count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBMJ > 10 and SR.TBLX = 'GJNYTB' 
where W.TCBM = 'GJNYTB' and W.TBBH = SR.TBBH 
group by SR.TBBH
查询结果
  • 创建视图 create view viewname As 查询语句
create view FJ_AMOUNTByTBBH As
select SR.TBBH, count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBMJ > 10 and SR.TBLX = 'GJNYTB' 
where W.TCBM = 'GJNYTB' and W.TBBH = SR.TBBH 
group by SR.TBBH
执行结果
视图创建成功
  • 利用视图查询
    在视图创建后之后,我们利用视图来查询国家内业图斑中图斑面积大于10亩的的图斑分别拥有的附件数量
select *
from FJ_AMOUNTByTBBH
查询结果
  • 优化视图

上面的视图,已经固定死了查询的条件,只能查询TBMJ > 10,TBLX = 'GJNYTB' 的图斑的附件数量,如果我们查询其他类型或者其他图斑面积的图斑附件数量就不能使用该视图。所以我们可以优化上面的视图,我们修改创建视图的查询语句,让其查询出SURVEY_RECORD表中所有图斑对应的附件数量、图斑面积、图斑类型、图斑编号

优化后的查询SQL:

select SR.TBBH, SR.TBMJ,SR.TBLX,count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBLX = W.TCBM 
where W.TBBH = SR.TBBH 
group by SR.TBBH

我们查询出SURVEY_RECORD表中所有图斑对应的附件数量、图斑面积、图斑类型、图斑编号,一共167条。


查询结果

创建视图的SQL:

create view FJ_AMOUNTByTBBH As
select SR.TBBH, SR.TBMJ,SR.TBLX,count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBLX = W.TCBM 
where W.TBBH = SR.TBBH 
group by SR.TBBH
执行结果
视图创建成功

利用新视图进行查询:

1、我们利用新视图查询国家内业图斑中图斑面积大于10亩的的图斑分别拥有的附件数量,SQL

select TBBH,FJ_AMOUNT
from FJ_AMOUNTByTBBH
where TBMJ > 10 and TBLX = 'GJNYTB'
查询结果

2、我们还可以利用新视图查询初次举证图斑中图斑面积大于5的图斑分别拥有的附件数量,SQL

select TBBH,FJ_AMOUNT
from FJ_AMOUNTByTBBH
where TBMJ > 5 and TBLX = 'CCJZ'
查询结果

利用视图过滤异常数据

例如,我们上面优化之后的查询语句,会查出SURVEY_RECORD表中所有图斑对应的附件数量、图斑面积、图斑类型、图斑编号,一共167行,但是我们可以看到其中有很多行TBMJ都为NULL,像这样的异常数据我们可以在创建视图的时候将其过滤掉

  • 我们使用视图FJ_AMOUNTByTBBH进行查询初次举证类型图斑的附件数量、图斑面积、图斑编号
select TBBH,TBMJ,FJ_AMOUNT
from FJ_AMOUNTByTBBH
where TBLX = 'CCJZ'
查询结果
  • 在查询语句中过滤TBMJ为NULL的数据
select SR.TBBH, SR.TBMJ,SR.TBLX,count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBLX = W.TCBM 
where W.TBBH = SR.TBBH and SR.TBMJ notnull
group by SR.TBBH
  • 创建新的视图FJ_AMOUNTByTBBH_New
create view FJ_AMOUNTByTBBH_New As
select SR.TBBH, SR.TBMJ,SR.TBLX,count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBLX = W.TCBM 
where W.TBBH = SR.TBBH and SR.TBMJ notnull
group by SR.TBBH
  • 利用新的视图进行相关查询
select TBBH,TBMJ,FJ_AMOUNT
from FJ_AMOUNTByTBBH_New
where TBLX = 'CCJZ'

过滤掉了TBMJ为NULL的情况


查询结果

删除视图 DROP VIEW

drop view FJ_AMOUNTByTBBH
执行结果

更新视图

更新视图 需要先删除视图再创建

你可能感兴趣的:(SQL学习十五、视图)