澳门新葡萄京娱乐网站-澳门新葡萄京888官网-所有平台

热门关键词: 澳门新葡萄京娱乐网站,澳门新葡萄京888官网

SQLServer之视图篇,超级好文

作者: MySQL数据库  发布:2019-12-11

1 视图介绍

         视图是从贰个要么多少个基本表(或视图卡塔尔导出的表。它与基本表差异,是八个虚表。数据库中只存放视图的概念,而不设有视图对应的数目,这几个数据依然贮存在原本的基本表中。所以只要基本表中的数据产生变化,从视图中查询的数额也就任何时候更改了。从那么些含义上讲,视图就疑似三个窗口,透过它能够看看数据库中自身感兴趣的数据及其变动。

1.1 视图的概述

      视图是从多少个要么多少个表导出的,它的行为与表特别相仿,但视图是一个虚构表,在视图中得以使用SELECT语句询问数据,以导致用insert、update和delete语句改过记录,对于视图的操作最后转变为对骨干数据表的操作。视图不只能够一本万利操作,何况能够保持数据库系统的安全性。

 视图意气风发经定义便蕴藏在数据库中,与其相呼应的数额并从未像表数据那样在数据库中在仓库储存大器晚成份,通过视图见到的多寡只是贮存在基本表中的数据。能够对其张开增加和删除该查,通过视图对数据改进,基本表数据也呼应变化,反之亦然。

 数据库中的视图是多个虚构表。同实际的表同样,视图满含一种类满含名称的列和行数据,行和列数据用来自由定义视图和查询所引述的表,並且在引用视图时动态发生。本篇将通过有个别实例来介绍视图的概念,视图的效用,成立视图,查看视图,矫正视图,更新和删除视图等SQL Server的数据库知识。

目录:后生可畏、视图的概念;

1.2 使用视图的目标与收益

1.聚焦特定数据:使客户只好看看和操作与他们关于的多寡,进步了数码的安全性。
2.简化数据操作:使客户不用写复杂的查询语句就可对数据开展操作。
3.定制客户数量:使不一致档期的顺序的顾客能以不一致的艺术来看差异的数目。
4.联合分离数量:视图能够从品位和垂直方向上划分数据,但原数据库的布局保持不改变。

风流洒脱:视图的概述

 视图是从叁个依旧八个表导出的,它的行事与表特别相通,但视图是一个设想表,在视图中得以接纳SELECT语句询问数据,以至使用insert、update和delete语句改善记录,对于视图的操作最终转变为对核心数据表的操作。视图不只能方便操作,并且可以维持数据库系统的安全性。

 视图生机勃勃经定义便蕴藏在数据库中,与其相呼应的数量并未有像表数据那样在数据库中在积攒后生可畏份,通过视图看见的数目只是贮存在基本表中的数据。能够对其进展增加和删除该查,通过视图对数码更改,基本表数据也对应变化,反之亦然。

二、视图的机能;

2 创立视图

语法:

 [ with check option ] --强制所有通过是同修改的数据,都要满足select语句中指定的条件
select查询语句
as
[ with encryption ] --用于加密视图的定义,用户只能查看不能修改。
[ (列名表) ]
create view 视图

先创制多少个学子表

use marvel_db;
--创建一个学生表
create table stuTable(
    id int identity(1,1)primary key,--id 主键,自增
    name varchar(20),
    gender char(2),
    age int,
)
--往表中插入数据
insert into stuTable (name,gender,age)
values
    ('刘邦','男',23),
    ('项羽','男',22),
    ('韩信','男',21); 
insert into stuTable(name,gender,age) values('萧何','男',24)  

始建视图

--创建视图
if (exists (select * from sys.objects where name = 'stu_view'))
    drop view stu_view
go
--stu_view()不实用参数,默认为基础表中的列名称
--注意 create view 必须是批处理里面的语句
create view stu_view 
as 
select name,age from stuTable where age>20;
go
--执行视图
select * from stu_view;  

查询结果:

图片 1

二:视图的分类

 SQL Server的视图能够分为3类,分别是:标准视图,索引视图,分区视图

2.1.正经视图

 标准视图组合了壹个或多少个表中的数据,能够拿到行使视图中的大非常多益处,包涵主要将放在特定的数量上及简化数据操作。

2.2.索引视图

 索引视图是被具体化了的视图,即它已经经过计量并积累。可感觉视图成立索引,对视图创建三个唯风流倜傥的聚焦索引。索引视图能够鲜明进步有个别项目查询的习性,索引视图尤其适于聚合大多行的询问,但它们不太适应平常更新的为主数据集。

2.3.分区视图

 分区视图在大器晚成台多多台服务器间水平连接意气风发组成员表的分区数据,那样,数据看上去就像是来自四个表。连接本地同四个SQL Server实例中的成员表的视图是二个本地点分视图。

三、创制视图;

3 匡正视图

 

go
alter view stu_view 
as
select * from stuTable where age>22;
go
select * from stu_view  

来得结果:

图片 2

三:视图的亮点和法力

与直接从表中读取数据相比较,视图具备一下独特之处

3.1.简单化

 见到的正是须要的,视图不仅可以够简化客户对数码的领悟,也得以简化对它们的操作,这个平常利用的查询能够被定义为视图,进而使得顾客不必要为其后的每一遍操作内定全体的原则。

3.2.安全性

 视图能够看做生龙活虎种安全部制。通过视图客商只好查看和改换他们所能见到的数额。其余或表既不可以看到也不可以访谈。假若某生机勃勃客商想要访问视图的,必需予以其访谈权限。视图所引用表的访问权限与视图权限的安装互不影响。

3.3.逻辑数据独立性

 视图可以帮衬客户屏蔽真实表结构调换带给的熏陶。

  1.权限

4 删除视图

 

go
--语法
drop view view_name1,view_name2,......,view_nameN;
--该语句可以同时删除多个视图,只要在删除各视图名称之间用逗号分隔即可。

比如:删除视图 stu_view

--语法
drop view stu_view;
--该语句可以同时删除多个视图,只要在删除各视图名称之间用逗号分隔即可。  

5 通过视图管理表中的数据

(1卡塔尔(英语:State of Qatar).通过视图向基本表中插入数据

注意:

1.可透过视图向基表中插入数据,但插入的数据实际上寄放在基表中,并非存放在视图中。

2.若是视图引用了多个表,使用insert语句插入的列必需归于同一个表。

3.若创立视图时定义了“with check option”选项,则利用视图向基表中插入数据时,必须保证插入后的数额满足定义视图的范围条件。

--(1).通过视图向基本表中插入数据
go
create view stu_insert_view(编号,姓名,性别,年龄)
as
select id,name,gender,age from stuTable;
go
select * from stuTable;
---插入一条数据
insert into stu_insert_view values('孙权','男',34);
----查看插入记录之后表中的内容。
select * from stuTable;  

来得结果:

图片 3

(2卡塔尔(قطر‎.通过视图校订基本表的数码

--查看修改之前的数据
select * from stuTable;  

展现结果:

图片 4

--修改数据
update stu_insert_view set 年龄=30 where 姓名='刘邦';
--查看修改后的数据
select * from stuTable;  

结果展现:

图片 5

(3卡塔尔(قطر‎.通过视图删除基本表的数目

注意:

1.要去除的多少必须带有在视图的结果聚焦。

2.举个例子视图援引了几个表时,不能用delete命令删除数据。

语法

--语法
delete stu_insert_view where condition;  

除去在此以前:

图片 6

删除:

--例子
delete stu_insert_view where 姓名 ='刘邦';
select * from stu_insert_view;
select * from stuTable;  

呈现结果:

图片 7

四:视图的基本操作和语法

4.1.开立视图

--语法
CREATE VIEW view_name
 AS
    SELECT column_name(s) FROM table_name
WHERE condition

测量检验数据酌量:

use sample_db;
create table studentTable(
    id int identity(1,1)primary key,
    name varchar(20),
    gender char(2),
    age int,
)
insert into studentTable (name,gender,age)
values
    ('刘备','男',28),
    ('张飞','男',24),
    ('关羽','男',26); 

--创建视图
if (exists (select * from sys.objects where name = 'student_view'))
    drop view student_view
go
--student_view()不实用参数,默认为基础表中的列名称
create view student_view 
as
select name,age from studentTable where age>24;
--执行视图
select * from student_view;

查阅视图的音信

  • 使用sp_help存款和储蓄进程查看视图的概念新闻
  • 使用sp_helptext系统存款和储蓄进程使用来体现法则,默许值,未加密的存款和储蓄进程,客户定义函数,触发器或视图的文件,语法

    exec sp_help 'student_view'; exec sp_helptext 'student_view';

创立加密视图:

--加密视图
if (exists (select * from sys.objects where name = 'student_encryption'))
    drop view student_encryption
go
create view student_encryption
with encryption --加密
as
    select id, name, age from studentTable
go
--view_definition is null
--查看加密视图
select * from information_schema.views 
where table_name like 'student_encryption';

 图片 8

  从实行结果可观看view_definition字段为 NULL

4.2.应用视图更改基本表数据

(1卡塔尔(英语:State of Qatar).通过视图向基本表中插入数据

--(1).通过视图向基本表中插入数据
create view stu_insert_view(编号,姓名,性别,年龄)
as
select id,name,gender,age from studentTable;
go
select * from studentTable;
---插入一条数据
insert into stu_insert_view values('曹操','男',40);
----查看插入记录之后表中的内容。
select * from studentTable;   

(2卡塔尔.通过视图改革基本表的多寡

--(2).通过视图修改基本表的数据
--查看修改之前的数据
select * from studentTable;
--修改数据
update student_view set age=30
where name='刘备';
--查看修改后的数据
select * from studentTable;

(3卡塔尔.通过视图删除基本表的数目

--语法
delete view_name where condition;
--例子
delete student_view where name ='张飞';
select * from student_view;
select * from studentTable;

 4.3.修该视图

--修改视图
alter view student_view 
as
select * from studentTable where age>26;

4.4.删减视图

 

--语法
drop view view_name1,view_name2,......,view_nameN;
--该语句可以同时删除多个视图,只要在删除各视图名称之间用逗号分隔即可。
drop view studentTable;

 

  2.语法

6总结

1.行使情况:

1.时一时使用的查询,或较复杂的多只查询相应创建视图,那是会优化质量的
2.关联到权力管理方面,举个例子某表中的部分字段含有机密信息,不应该让低权限的顾客访谈到的动静,此时给那一个客商提供一个合乎他们权限的视图,供他们读书自身的多寡就能够了。
2.视图与表的不同:

1.视图是生龙活虎度编写翻译好的SQL语句,是基于SQL语句的结果集的可视化表,而表不是;
2.视图(除过索引视图)未有实际的情理记录,而基本表有;
3.代表内容,视图是窗口;
4.表占物理空间,而视图不占物理空间,视图只是逻辑概念的留存;
5.视图是查看数据表的生机勃勃种办法,能够查询数据表中有些字段构成的数目,只是大器晚成对SQL语句的聚集。从平安角度说,视图能够幸免客户接触数据表,进而不知表布局;
6.表归属全局格局的表,是实表;视图数据局地格局的表,是虚表;
7.视图的建会谈删除只影响视图本人,不影响对应的基本表。

 

转载自:

五:视图和表的界别

  1. 视图是早就编写翻译好的SQL语句,是依照SQL语句的结果集的可视化表,而表不是;
  2. 视图(除过索引视图)未有实际的物理记录,而基本表有;
  3. 代表内容,视图是窗口;
  4. 表占物理空间,而视图不占物理空间,视图只是逻辑概念的存在;
  5. 视图是查看数据表的风度翩翩种格局,能够查询数据表中有些字段构成的数量,只是有的SQL语句的集中。从平安角度说,视图能够幸免顾客接触数据表,进而不知表构造;
  6. 表归属全局情势的表,是实表;视图数据局部格局的表,是虚表;
  7. 视图的创造和删除只影响视图自个儿,不影响对应的基本表。

      3.1  创制轻巧视图

    3.2  成立连接视图

     3.2.1 连接视图定义

     3.2.2 创制连接视图

     3.2.3 连接视图上的DML操作

     3.2.4 键值保存表

     3.2.5 总是视图的翻新法则

*     3.2.6 *可更新连接视图**

  3.3 创建复杂视图

  3.4 强逼创建视图

四 修改视图

     4.1 修改视图的定义

  4.2 视图的再度编译

五、删除视图

六、查看视图

七、 在视图上实行DML操作的步骤和规律

  7.1 询问视图“可更新”(包涵“增加和删除改”卡塔尔的列

*  *7.2 视图DML实施据守的尺度:

八、视图轻巧并发的标题

九、附加“视图的品种与差异”

     9.1 关系视图

  9.2 内嵌视图

  9.3 对象视图

  9.4 物化视图

 

 

风度翩翩. 视图的概念

视图(view卡塔尔国,也称虚表, 不占用物理空间,那一个也是相对概念,因为视图自身的概念语句如故要存款和储蓄在数据字典里的。视图独有逻辑定义。每一次使用的时候,只是再次奉行SQL。

  视图是从一个或多少个实在表中拿到的,这么些表的数码存放在数据库中。那么些用来发生视图的表叫做该视图的基表。四个视图也足以从另叁个视图中发生。

  视图的定义存在数据库中,与此定义相关的数码并从未再存意气风发份于数据库中。通过视图看见的多少贮存在基表中。

  视图看上去极度象数据库的物理表,对它的操作同其它其余的表同样。当通过视图更改数据时,实际上是在更改基表中的数据;相反地,基表数据的转移也会活动反映在由基表产生的视图中。由于逻辑上的缘由,有个别Oracle视图能够改革对应的基表,有个别则不可能(仅仅能查询)。

  还大概有风华正茂种视图:物化视图(MATE科雷傲IALIZED VIEW ),也称实体化视图,快速照相 (8i 以前的说法) ,它是包罗数据的,占用存款和储蓄空间。

  注意: 查询视图未有啥样范围, 插入/更新/删除视图的操作会受到一定的约束; 全体针对视图的操作都会影响到视图的基表; 为了以免万后生可畏客商通过视图直接校订基表的数据, 能够将视图创造为只读视图(带上with read only选项卡塔尔

 

二. 视图的功力

1卡塔尔(英语:State of Qatar)提供种种数码展现格局, 能够选择各样不一致的方法将基表的数目显现在客户眼下, 以便切合顾客的施用习贯(主要招式: 使用小名卡塔尔(قطر‎;

2卡塔尔国隐敝数据的逻辑复杂性并简化查询语句, 多表查询语句平时是相比复杂的, 而且顾客必要了健胃之间的关系, 不然轻易写错; 即使依据那样的查询语句创造三个视图, 客户就能够直接对这些视图实行"轻巧询问"而得到结果. 那样就掩没了数据的复杂并简化了查询语句.那也是oracle提供各个"数据字典视图"的因由之大器晚成,all_constraints正是八个带有2个子查询并接连了9个表的视图(在catalog.sql中定义卡塔尔(英语:State of Qatar);

3卡塔尔(قطر‎实施有些必得运用视图的查询. 某个查询必需借助视图的赞助工夫完结. 比方, 有个别查询必要连接八个分组总结后的表和另一表, 此时就足以先依据分组总结的结果成立一个视图, 然后在询问香港中华总商会是那个视图和另一个表就足以了;

4卡塔尔(قطر‎提供一些安全性保证. 视图提供了朝气蓬勃种能够垄断(monopoly卡塔尔的艺术, 即能够让分化的客户见到分歧的列, 而不容许访谈这三个敏感的列, 那样就足以确定保证敏感数据不被客商见到;

*      5卡塔尔国简化顾客权限的管理. 可以将视图的权杖付与客商, 而不必然基表中一些列的权力赋予客商, 那样就简化了顾客权限的概念。*

 

三 创造视图

1权限: 要在这个时候此刻方案中开创视图, 顾客必得持有create view系统权限; 要在任何方案中开创视图, 顾客必需怀有create any view系统权限. 视图的效果在于视图具备者的权限.

*2 语法:*

create [ or replace ] [ force ] view [schema.]view_name
                      [ (column1,column2,...) ]
                      as 
                      select ...
                      [ with check option ]                      [ constraint constraint_name ]
                      [ with read only ]; 

 

其中:

       1. or replace:  如若存在同名的视图, 则使用新视图"替代"已部分视图
   2. force:  "抑遏"创设视图,不考虑基表是或不是留存,也不思忖是还是不是享有应用基表的权能
   3. column1,column2,...: 视图的列名, 列名的个数必需与select查询中列的个数相符; 若是select查询包罗函数或表明式, 则必需为其定义列名.那个时候, 不仅能用column1, column2内定列名, 也得以在select查询中钦定列名.
   4. with check option:  钦赐对视图推行的dml操作必需知足“视图子查询”的法规即,对经过视图举行的增加和删除改操作实行"检查",供给增加和删除改操作的数据, 必需是select查询所能查询到的数量,不然不准操作并赶回错误提示. 暗中认可景况下, 在增加和删除改早先"并不会检查"那个行是还是不是能被select查询检索到. 
   5. with read only: 创立的视图只可以用于查询数据, 而无法用来转移数据.

 

3.1 创办简单视图

简易视图定义:是指依照单个表创立的,不分包别的函数、表达式和分组数据的视图。

 SQL> conn /as sysdba

Connected.

SQL> grant create view to scott;

SQL> conn scott/tiger

Connected.

SQL> create view vw_emp as select empno,ename,job,hiredate,deptno from emp;

SQL> desc vw_emp

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 EMPNO                                     NOT NULL NUMBER(4)

 ENAME                                              VARCHAR2(10)

 JOB                                                VARCHAR2(9)

 HIREDATE                                           DATE

 DEPTNO                                             NUMBER(2)


SQL> select * from vw_emp where deptno=10;


     EMPNO ENAME      JOB       HIREDATE      DEPTNO

----------  ----------     ---------    ---------      

      7782 CLARK      MANAGER    09-JUN-81          10

      7839 KING       PRESIDENT   17-NOV-81         10

      7934 MILLER     CLERK       23-JAN-82          10

 

对简易的视图实行DAM操作:

 SQL> select empno,ename,job,hiredate,deptno from emp where deptno=10;


     EMPNO ENAME      JOB       HIREDATE      DEPTNO

---------- ---------- --------- --------- ----------

      7782 CLARK      MANAGER   09-JUN-81         10

      7934 MILLER     CLERK     23-JAN-82         10

         1 a          aa        05-JUN-88         10


SQL> select object_name,object_type from user_objects;

OBJECT_NAME                    OBJECT_TYPE

------------------------------ -------------------

VW_EMP                         VIEW

SALGRADE                       TABLE

BONUS                          TABLE

PK_EMP                         INDEX

EMP                            TABLE

DEPT                           TABLE

PK_DEPT                        INDEX 

 

始建只读视图:

 SQL> create view vw_emp_readonly as select empno,ename,job,hiredate,deptno from emp with read only;


SQL> select * from vw_emp_readonly where deptno=10;


     EMPNO ENAME      JOB       HIREDATE      DEPTNO

---------- ---------- --------- --------- ----------

      7782 CLARK      MANAGER   09-JUN-81         10

      7934 MILLER     CLERK     23-JAN-82         10

         1 a          aa        05-JUN-88         10

 

只能查询,无法张开改进:

 

 SQL> delete vw_emp_readonly where empno=1;

delete vw_emp_readonly where empno=1

       *

ERROR at line 1:

ORA-42399: cannot perform a DML operation on a read-only view

 

更新基表,只读视图也发出变动:

 SQL> update emp set empno=2 where ename='a';

SQL> select * from vw_emp_readonly where deptno=10;


     EMPNO ENAME      JOB       HIREDATE      DEPTNO

---------- ---------- --------- --------- ----------

      7782 CLARK      MANAGER   09-JUN-81         10

      7934 MILLER     CLERK     23-JAN-82         10

         2 a          aa        05-JUN-88         10

 

始建检查约束视图with check option:

 Sql>create view vw_emp_check as select empno,ename,job,hiredate,deptno from emp where deptno=10 with check option;


SQL> insert into vw_emp_check values('2','c','cc','02-JAN-55',10);


SQL> insert into vw_emp_check values('3','d','dd','02-JAN-65',20);

insert into vw_emp_check values('3','d','dd','02-JAN-65',20)

            *

ERROR at line 1:

ORA-01402: view WITH CHECK OPTION where-clause violation 

注意:

创设检查视图:对通过视图实行的增加和删除改操作举行检讨,必要增加和删除改操作的多少必得是select查询所能查询到的数量

20号部门不在查询范围内,违背检查约束,所以不也许插入;

 

 SQL> delete vw_emp_check where empno=2;


1 row deleted.

--------所删除的数据在查询范围内,不违反检查约束  

 

 

3.2 连接视图

3.2.1 三番三次视图定义:是指根据多个表所创立的视图,即,定义视图的询问是二个三回九转查询。 首要目标是为了简化连接查询;

3.2.2 创办连接视图

亲自去做1: 查询部门编号为10和30的机构及雇员音信

 SQL> create view vw_dept_emp

  2  as select a.deptno,a.dname,a.loc,b.empno,b.ename,b.sal from dept a,emp b where a.deptno=b.deptno and a.deptno in(10,30);


View created.


SQL> select * from vw_dept_emp;


    DEPTNO DNAME          LOC             EMPNO ENAME             SAL

---------- -------------- ------------- ---------- ---------- ----------

        30 SALES          CHICAGO             7499 ALLEN            1600

        30 SALES          CHICAGO             7521 WARD             1250

        30 SALES          CHICAGO             7654 MARTIN           1250

        30 SALES          CHICAGO             7698 BLAKE            2850

        10 ACCOUNTING    NEW YORK           7782 CLARK            2450

        30 SALES          CHICAGO             7844 TURNER           1500

        30 SALES          CHICAGO             7900 JAMES             950

        10 ACCOUNTING    NEW YORK           7934 MILLER           1300

        10 ACCOUNTING     NEW YORK               1 a


9 rows selected. 

 

3.2.3 连接视图上的DML操作

 SQL> insert into vw_dept_emp values(10,'aaa','aaaa',22,'a',5000);

insert into vw_dept_emp values(10,'aaa','aaaa',22,'a',5000)

*

ERROR at line 1:

ORA-01779: cannot modify a column which maps to a non key-preserved table 

在乎:在视图上实行的装有DML操作,最后都会在基表上做到;
select 视图未有何样范围,但insert/delete/update有部分限定;

 

 

*3.2.4**键值保存表***

要是一连视图中的多少个“基表的键”(主键、唯生机勃勃键)在它的视图中依然存在,况兼“基表的键”仍然为“连接视图中的键”(主键、唯大器晚成键卡塔尔(قطر‎;即,某列在基表中是主键|唯大器晚成键,在视图中依旧是主键|唯生机勃勃键,则称这几个基表为“键值保存表”。   
  日常地,由主外键关系的2个表组成的总是视图,外键表正是键值保存表,而主键表不是。  

3.2.5 接连几天视图的换代法则

 少年老成:平日法则——(讲卡塔尔(قطر‎
     1. 其余DML操作,只可以对视图中的键值保存表进行更新, 即,“不能由此一连视图修    改多个基表”;
     2. 在DML操作中,“只好接纳连接视图定义过的列”;
     3. 自连接视图”的具备列都以可更新(增加和删除改卡塔尔(قطر‎的
 二:insert准则
     1. 在insert语句中不能够应用“非键值保存表”中的列(包含“连接列”卡塔尔;
     2. 推行insert操作的视图,至少应当“富含”键值保存表中具备安装了约束的列;
     3. 借使在概念连接视图时选择了WITH CHECK OPTION 选项,则“不能够”针对三番四回视 图推行insert操作 
 三:update准则
     1. 键值保存表中的列是足以立异的;
     2. 若是在概念连接视图时选拔了WITH CHECK OPTION 选项,则连年视图中的连接列(平常就是“共有列”卡塔尔(英语:State of Qatar)和基表中的“其余共有列”是“不可”更新的,连接列和共有列之外的 别的列是“能够”更新的
 四:delete准则
     1. 假诺在概念连接视图时选用了WITH CHECK OPTION 选项,依旧“能够”针对接二连三视图试行delete操作 

3.2.6 可更新连接视图

  就算创设连接视图的select查询“不含有”如下结构,何况遵循连接视图的“更新法规”,则那样的连天视图是“可更新”的:

  6.1 集结运算符(union,intersect,minus)
  6.2:DISTINCT关键字
  6.3:GROUP BY,ORDER BY,CONNECT BY或START WITH子句
  6.4:子查询
  6.5:分组函数
  6.6:须求更新的列不是由“列表达式”定义的
  6.7:基表中持有NOT NULL列均归属该视图 

 

 

3.3 创立复杂视图

复杂视图定义:是指包括函数、表达式、或分组数据的视图。首要目标是为了简化查询。主要用于实践查询操作,并不用于实践DML操作。
  注意:当视图的select查询中满含函数或表达式时,必得为其定义列别名。

 示例1:查询近日各样地方的平均薪资、薪水总的数量、最高级程序猿资和最低薪给。

 

 SQL> create view vw_emp_job_sal(job,avgsal,sumsal,maxsal,minsal)

  2  as select job,avg(sal),sum(sal),max(sal),min(sal) from emp group by job;


View created.


SQL> select * from vw_emp_job_sal;


JOB           AVGSAL     SUMSAL     MAXSAL     MINSAL

--------- ---------- ---------- ---------- ----------

CLERK         1037.5       4150       1300        800

SALESMAN        1400       5600       1600       1250

aa

MANAGER   2758.33333       8275       2975       2450

ANALYST         3000       6000       3000       3000

 

 

3.4 强逼作而成立视图

免强视图定义:符合规律状态下,假设基表不真实,创制视图就能够退步。不过足以应用force选项强逼作而成立视图(前提:创造视图的口舌未有语法错误!卡塔尔(قطر‎,那个时候该视图处于失效状态。

 SQL> create force view vw_test_tab

  2  as select c1,c2 from test_tab; 

Warning: View created with compilation errors. 警示: 成立的视图带有编写翻译错误。

 SQL> select * from vw_test_tab;

select * from vw_test_tab

              *

ERROR at line 1:

ORA-04063: view "SCOTT.VW_TEST_TAB" has errors


SQL> select object_name,status from user_objects where object_name='VW_TEST_TAB';


OBJECT_NAME                    STATUS

------------------------------ -------

VW_TEST_TAB                    INVALID ---------视图状态为不可用


SQL> create table test_tab(c1 number(9) primary key,c2 varchar2(20),c3 varchar2(30));


Table created.


SQL> select * from vw_test_tab;


no rows selected



SQL> select object_name,status from user_objects where object_name='VW_TEST_TAB';


OBJECT_NAME                    STATUS

------------------------------ -------

VW_TEST_TAB                    VALID  --------------视图状态为可用

 

四 改过视图

在对视图实行改造(或重定义卡塔尔(قطر‎在此之前,需求思谋如下多少个难题:
  1. 由于视图只是一个虚表,个中并非常的少,所以改进视图只是改造多少字典中对该视图的
 定义音信,视图的富有根底对象都不会遭遇其余影响
  2. 改动视图之后,信任于该视图的装有视图和PL/SQL程序都将成为INVALID(失效卡塔尔(英语:State of Qatar)状态
  3. 意气风发旦原先的视图中持有with check option选项,不过重定义时未有使用该选项,则以前                 

的此选项将活动删除。 

 

4.1***更改视图的定义***
          方法——执行create or replace view语句。这种方法替代了先删除(“权限也将进而删除”卡塔尔(英语:State of Qatar)后创制的秘诀,会保留视图上的权限,但与该视图相关的积存进度和视图会失效。

 

演示1:将视图改为改为只读:

 SQL> create or replace view vw_emp

  2  as

  3  select empno,ename,job,hiredate,deptno from emp with read only;


View created. 

 

 

4.2***视图的双重编写翻译*    语法:alter view 视图名 compile;   作用:当视图依赖的基表改换后,视图会“失效”。为了确定保证这种更动“不影响”视图和重视于该视图的其余对象,应该采用alter view 语句“鲜明的重复编写翻译”该视图,进而在运作视图前开掘重新编写翻译的不当。视图被另行编写翻译后,若开掘错误,则依附该视图的目的也会失灵;若未有不当,视图会变为“有效”。   权限:为了重新编写翻译别的格局中的视图,必得具有alter any table系统权限。   注意:**当访谈基表改造后的视图时,oracle会“自动重新编写翻译”那些视图。

 

示例1:

 SQL> select last_ddl_time,object_name,status from user_objects where object_name='VW_TEST_TAB';


LAST_DDL_ OBJECT_NAME                    STATUS

--------- ------------------------------ -------

23-AUG-14 VW_TEST_TAB                    VALID     -----视图的状态:有效 


SQL> alter table test_tab modify(c2 varchar2(30)); ——修改基表,c2列的长度


SQL> select last_ddl_time,object_name,status from user_objects where object_name='VW_TEST_TAB';


LAST_DDL_ OBJECT_NAME                    STATUS

--------- ------------------------------ -------

23-AUG-14 VW_TEST_TAB                    INVALID     ——视图的状态:失效 


SQL> alter view vw_test_tab compile;                 ---重新编译


SQL> select last_ddl_time,object_name,status from user_objects where object_name='VW_TEST_TAB';


LAST_DDL_ OBJECT_NAME                    STATUS

--------- ------------------------------ -------

23-AUG-14 VW_TEST_TAB                    VALID         ---视图有效

请读者思想叁个主题材料:

    若上述代码纠正的不是列长,而是表名,结果又会什么?
   <警示:校勘的视图带有编写翻译错误;视图状态:失效>

 

五 删除视图

   语法:DROP VIEW VIEW_NAME

  能够去除当前形式中的任何视图,删除视图的概念不影响基表中的数据。

   借使要刨除其余形式中的视图,必需有所DROP ANY VIEW系统权限;
   视图被删除后,该视图的概念会从词典中被剔除,何况在该视图上予以的“权限”也将被删去。
   视图被去除后,其余援引该视图的视图及仓储进程等都会失灵。
       示例1:drop view vw_test_tab; 

六 查看视图

接纳数据字典视图
1 dba_views——DBA视图描述数据库中的全部视图
2 all_views——ALL视图描述客户“可访问的”视图
3 user_views——USECR-V视图描述“客户全体的”视图 
4 dba_tab_columns——DBA视图描述数据库中的全部视图的列(或表的列卡塔尔(قطر‎
5 all_tab_columns——ALL视图描述客商“可访谈的”视图的列(或表的列卡塔尔国
6 user_tab_columns——USE福睿斯视图描述“客户全体的”视图的列(或表的列卡塔尔 

亲自去做1:查询当前方案中持有视图的新闻

 SQL> select view_name,text from user_views;

VIEW_NAME          TEXT

------------------ -------------------------------------------------------

VW_DEPT_EMP        select a.deptno,a.dname,a.loc,b.empno,b.ename,b.sal fro

                     m dept a,emp b where a.de


VW_EMP              select empno,ename,job,hiredate,deptno from emp

VW_EMP_CHECK       select empno,ename,job,hiredate,deptno from emp where d

                     eptno=10 with check optio


VW_EMP_JOB_SAL     select job,avg(sal),sum(sal),max(sal),min(sal) from emp

                    group by job


VW_EMP_READONLY    select empno,ename,job,hiredate,deptno from emp with re

                      ad only


VW_TEST_TAB        select c1,c2 from test_tab


6 rows selected. 

演示2:查询当前方案中钦赐视图(或表卡塔尔(英语:State of Qatar)的列名消息

select * from user_tab_columns where table_name='VW_DEPT'; 

七 在视图上推行DML操作的步骤和规律

第一步:将针对视图的SQL语句与视图的定义语句(保存在多少字典中卡塔尔国“合併”成一条SQL语句

第二步:在内部存款和储蓄器构造的分享SQL区中“剖析”(并优化卡塔尔国归总后的SQL语

第三步:“执行”SQL语句

演示:纵然视图v_emp的概念语句如下:

create view v_emp 
as
select empno,ename,loc from employees emp,departments dept
where

 emp.deptno=dept.deptno and dept.deptno=10; 

当顾客实践如下查询语句时:

select ename from v_emp where empno=9876; 

oracle将把这条SQL语句与视图定义语句“归总”成如下查询语句:

select ename from employees emp,departments dept
where

 emp.deptno=dept.deptno and dept.deptno=10 and empno=9876; 

接下来,剖判(并优化卡塔尔合併后的询问语句,并进行查询语句;

 

7.1***查询视图“可更新”(包涵“增加和删除改”卡塔尔(英语:State of Qatar)的列***

行使数据字典视图

dba_updatable_columns——展现数据库全体视图中的全数列的可更新意况

all_updatable_columns——展现客商可访谈的视图中的全数列的可更新情况                                  

      user_updatable_columns——显示客户全部的视图中的全部列的可更新景况

 

示例1:

 SQL> select table_name,column_name,insertable,updatable,deletable from user_updatable_columns;


TABLE_NAME                     COLUMN_NAME                    INS UPD DEL

------------------------------ ------------------------------ --- --- ---

VW_EMP_READONLY                EMPNO                          NO  NO  NO

VW_EMP_READONLY                ENAME                          NO  NO  NO

VW_EMP_READONLY                JOB                            NO  NO  NO

VW_EMP_READONLY                HIREDATE                       NO  NO  NO

VW_EMP_READONLY                DEPTNO                         NO  NO  NO

VW_EMP_CHECK                   EMPNO                          YES YES YES

VW_EMP_CHECK                   ENAME                          YES YES YES

VW_EMP_CHECK                   JOB                            YES YES YES

VW_EMP_CHECK                   HIREDATE                       YES YES YES 





9 row selected.

 

7.2 视图DML推行信守的标准:

1.轻松视图能够实施DML操作;
2.在视图包涵GROUP 函数,GROUP BY子句,DISTINCT关键字时不能够去除数据行;
3.在视图不现身下列情状时可由此视图改革基表数据或插队数据:

a.视图中富含GROUP 函数,GROUP BY子句,DISTINCT关键字;
b.使用表达式定义的列;
c.ROWNUM伪列。
d.基表中未在视图中选择的任何列定义为非空且无暗许值。
WITH CHECK OPTION 子句
因此视图推行的INSERTS和UPDATES操作不能够成立该视图检索不到的数额行, 因为它会对插入或改变的数额行实践完整性约束和多罕有效性检查。 (也正是说在试行INSERTS、UPDATES时,WHERE条件中除需求INSERT、UPDATE自身的节制标准之外,还亟需加多视图创立时的WHERE条件。)

 

八、视图轻易并发的主题材料

Oracle视图极度常有力的功用之意气风发在于其得以创造一个满含错误的视图。比方说视图里的字段在基表里不设有,该视图照旧能够创建设成功,可是违法的且不只怕实施。当基表里加入了该字段,或许说某些字段修正成视图里的该字段名称,那么视图立时就可以改为官方的。这些职能很风趣。
例子:
始建基表:

 create table v_test (name varchar2(32),age number(12)); 

创建带错误的视图:

create force view view_test as select name,age,address from v_test; --(注意加上force选项) 

由于address字段在v_test里不设有,所以会报warning: View created with compilation errors的告诫,何况实行select * from view_test;时会报“ORA-04063: view “SCOTT.VIEW_TEST” 有错误”的异常。

不过只要在v_test里丰盛address字段,那么视图就能够法定。
对基表举行修改:

alter table v_test add (address varchar2(128));

近日再进行

select * from view_test

就能够实行成功了。

 

别的难点总计:
1、视图上是否可以创制索引?
貌似视图上无须创建目录,对视图的操作最后会转接为对表的操作。
二个谈谈:

 

九、 视图的花色与区别

      9.1  关系视图:Oracle视图是当做数据库对象存在的,由此,创造之后也得以经过工具或数额字典来查看视图的连带音信。那是大家常用的视图

  如:create view 视图名称 as 查询语句|关系运算

  9.2  内嵌视图:在from语句中的能够把表改成叁个子询问,如:select a.id ,b.id from emp a,(select id from dept卡塔尔(英语:State of Qatar) b where a.id=b.id内嵌视图不归属别的用户,亦不是目的,内嵌视图是子查询的朝气蓬勃种,能够与数据表、视图形似作为查询语句的数据源存在,但在格局上有相当大的差距,内嵌视图不必接收create view命令实行创办,由此,在数量字典中也不可能获得对应音讯。内嵌视图的表征在于无须创设真正的数据库对象,而只是封装询问,由此会节省数据库财富,同偶尔候不会增多保证花费。但是内嵌视图不具备可复用性,由此当预期将要多处调用到平等查询定义时,依然应当选择关系视图。

  9.3  对象视图:对象类型在数据库编程中有许多实惠,但神跡,应用程序已经开拓到位。为了阿谀逢迎对象类型而重新建立数据表是不具体的。对象视图正是化解那黄金年代题指标名特别巨惠计策。

  对象视图成立之后,同样能够在数码字典中赢得其相应音信。利用Oracle内置视图user_views能够收获对象视图相关新闻。Oracle中的对象数据实际上依旧以关周密据的花样存储。可是,对象的表征,比方世襲、封装等,都为开采职员提供了更加灵敏的管理形式。相仿,能够组织复杂的指标类型来封装复杂的多表查询。

  9.4  物化视图:常用于数据库的容灾,不是古板意义上设想视图,是实体化视图,和表相仿能够积存数据、查询数据。主备数据库数据同步通过物化视图实现,主备数据库通过data link连接,在主备数据库物化视图举行数据复制。当主数据库垮掉时,备数据库接管,完结容灾。

 

 

 

 

本文由澳门新葡萄京娱乐网站发布于MySQL数据库,转载请注明出处:SQLServer之视图篇,超级好文

关键词: