1.2 使用视图的目的与好处

1.聚焦特定数据:使用户只能看到和操作与他们有关的数据,提高了数据的安全性。
2.简化数据操作:使用户不必写复杂的查询语句就可对数据进行操作。
3.定制用户数据:使不同水平的用户能以不同的方式看到不同的数据。
4.合并分离数据:视图可以从水平和垂直方向上分割数据,但原数据库的结构保持不变。

二:视图的分类

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

2.1.标准视图

 标准视图组合了一个或多个表中的数据,可以获得使用视图中的大多数好处,包括重点将放在特定的数据上及简化数据操作。

2.2.索引视图

 索引视图是被具体化了的视图,即它已经经过计算并存储。可以为视图创建索引,对视图创建一个唯一的聚集索引。索引视图可以显著提高某些类型查询的性能,索引视图尤其适于聚合许多行的查询,但它们不太适于经常更新的基本数据集。

2.3.分区视图

 分区视图在一台多多台服务器间水平连接一组成员表的分区数据,这样,数据看上去如同来自一个表。连接本地同一个SQL Server实例中的成员表的视图是一个本地区分视图。

  2.语法

1 视图介绍

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

1.1 视图的概述

    
 视图是从一个或者多个表导出的,它的行为与表非常相似,但视图是一个虚拟表,在视图中可以使用SELECT语句查询数据,以及使用insert、update和delete语句修改记录,对于视图的操作最终转化为对基本数据表的操作。视图不仅可以方便操作,而且可以保障数据库系统的安全性。

 视图一经定义便存储在数据库中,与其相对应的数据并没有像表数据那样在数据库中在存储一份,通过视图看到的数据只是存放在基本表中的数据。可以对其进行增删该查,通过视图对数据修改,基本表数据也对应变化,反之亦然。

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

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';

 图片 1

  从执行结果可看出view_definition字段为 NULL

4.2.使用视图修改基本表数据

(1).通过视图向基本表中插入数据

--(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;

 

只能查询,无法进行更改:

3 修改视图

 

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

select * from stu_view  

显示结果:

图片 2

五:视图和表的区别

  1. 视图是已经编译好的SQL语句,是基于SQL语句的结果集的可视化表,而表不是;
  2. 视图(除过索引视图)没有实际的物理记录,而基本表有;
  3. 表示内容,视图是窗口;
  4. 表占物理空间,而视图不占物理空间,视图只是逻辑概念的存在;
  5. 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全角度说,视图可以防止用户接触数据表,从而不知表结构;
  6. 表属于全局模式的表,是实表;视图数据局部模式的表,是虚表;
  7. 视图的建立和删除只影响视图本身,不影响对应的基本表。

*  *7.2 视图DML执行遵循的原则:

6总结

1.使用场景:

1.经常用到的查询,或较复杂的联合查询应当创立视图,这是会优化性能的
2.涉及到权限管理方面,比如某表中的部分字段含有机密信息,不应当让低权限的用户访问到的情况,这时候给这些用户提供一个适合他们权限的视图,供他们阅读自己的数据就行了。
2.视图与表的区别:

1.视图是已经编译好的SQL语句,是基于SQL语句的结果集的可视化表,而表不是;
2.视图(除过索引视图)没有实际的物理记录,而基本表有;
3.表示内容,视图是窗口;
4.表占物理空间,而视图不占物理空间,视图只是逻辑概念的存在;
5.视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全角度说,视图可以防止用户接触数据表,从而不知表结构;
6.表属于全局模式的表,是实表;视图数据局部模式的表,是虚表;
7.视图的建立和删除只影响视图本身,不影响对应的基本表。

 

转载自:

 数据库中的视图是一个虚拟表。同真实的表一样,视图包含一系列带有名称的列和行数据,行和列数据用来自由定义视图和查询所引用的表,并且在引用视图时动态产生。本篇将通过一些实例来介绍视图的概念,视图的作用,创建视图,查看视图,修改视图,更新和删除视图等SQL Server的数据库知识。

3.2.5 连接视图的更新准则

4 删除视图

 

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

例如:删除视图 stu_view

–语法
drop view stu_view;

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

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

(1).通过视图向基本表中插入数据

注意:

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

三:视图的优点和作用

与直接从表中读取数据相比,视图具有一下优点

3.1.简单化

 看到的就是需要的,视图不仅可以简化用户对数据的理解,也可以简化对它们的操作,那些经常使用的查询可以被定义为视图,从而使得用户不必为以后的每次操作指定全部的条件。

3.2.安全性

 视图可以作为一种安全机制。通过视图用户只能查看和修改他们所能看到的数据。其它或表既不可见也不可以访问。如果某一用户想要访问视图的,必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响。

3.3.逻辑数据独立性

 视图可以帮助用户屏蔽真实表结构变化带来的影响。

  可以删除当前模式中的任何视图,删除视图的定义不影响基表中的数据。

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;  

查询结果:

图片 8

一:视图的概述

 视图是从一个或者多个表导出的,它的行为与表非常相似,但视图是一个虚拟表,在视图中可以使用SELECT语句查询数据,以及使用insert、update和delete语句修改记录,对于视图的操作最终转化为对基本数据表的操作。视图不仅可以方便操作,而且可以保障数据库系统的安全性。

 视图一经定义便存储在数据库中,与其相对应的数据并没有像表数据那样在数据库中在存储一份,通过视图看到的数据只是存放在基本表中的数据。可以对其进行增删该查,通过视图对数据修改,基本表数据也对应变化,反之亦然。

     3.2.3 连接视图上的DML操作

视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。视图只有逻辑定义。每次使用的时候,只是重新执行SQL。

  视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。

 

1)提供各种数据表现形式, 可以使用各种不同的方式将基表的数据展现在用户面前,
以便符合用户的使用习惯(主要手段: 使用别名);

八、视图容易出现的问题

 

  4.2 视图的重新编译

示例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         ---视图有效

 

 

dba_updatable_columns——显示数据库所有视图中的所有列的可更新状态

八、视图容易出现的问题

 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:查询当前方案中指定视图(或表)的列名信息

     9.1 关系视图

其中:

 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  创建连接视图

创建带错误的视图:

对简单的视图进行DAM操作:

 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  --------------视图状态为可用

但是如果在v_test里加上address字段,那么视图就会合法。
对基表进行修改:

  9.4 物化视图

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

 

  9.3 对象视图

 

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

  1.权限

使用数据字典视图

 

Warning: View created with compilation errors. 警告:
创建的视图带有编译错误。

all_updatable_columns——显示用户可访问的视图中的所有列的可更新状态                                  

 

     4.1 更改视图的定义

  视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。

 

2)隐藏数据的逻辑复杂性并简化查询语句,
多表查询语句一般是比较复杂的, 而且用户需要了解表之间的关系,
否则容易写错; 如果基于这样的查询语句创建一个视图,
用户就可以直接对这个视图进行”简单查询”而获得结果.
这样就隐藏了数据的复杂性并简化了查询语句.这也是oracle提供各种”数据字典视图”的原因之一,all_constraints就是一个含有2个子查询并连接了9个表的视图(在catalog.sql中定义);

 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

七 在视图上执行DML操作的步骤和原理

 

      user_updatable_columns——显示用户拥有的视图中的所有列的可更新状态

3.2 连接视图

第二步:在内存结构的共享SQL区中“解析”(并优化)合并后的SQL语

 

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

二. 视图的作用

 

 

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

三、创建视图;

示例:假设视图v_emp的定义语句如下:

3.3 创建复杂视图

 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执行遵循的原则:

就会执行成功了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注