澳门金沙vip 8

澳门金沙vipSQLServer之视图篇

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;  

查询结果:

澳门金沙vip 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  

显示结果:

澳门金沙vip 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).通过视图向基本表中插入数据

注意:

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;  

显示结果:

澳门金沙vip 3

(2).通过视图修改基本表的数据

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

显示结果:

澳门金沙vip 4

–修改数据
update stu_insert_view set 年龄=30 where 姓名=’刘邦’;
–查看修改后的数据

select * from stuTable;  

结果显示:

澳门金沙vip 5

(3).通过视图删除基本表的数据

注意:

1.要删除的数据必须包含在视图的结果集中。

2.如果视图引用了多个表时,无法用delete命令删除数据。

语法

–语法
delete stu_insert_view where condition;  

删除之前:

澳门金沙vip 6

删除:

–例子
delete stu_insert_view where 姓名 =’刘邦’;
select * from stu_insert_view;

select * from stuTable;  

显示结果:

澳门金沙vip 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';

 澳门金沙vip 8

  从执行结果可看出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;

 

  2.语法

6总结

1.使用场景:

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

澳门金沙vip,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视图可以修改对应的基表,有些则不能(仅仅能查询)。

  还有一种视图:物化视图(MATERIALIZED
VIEW ),也称实体化视图,快照 (8i 以前的说法) ,它是含有数据的,占用存储空间。

  注意: 查询视图没有什么限制, 插入/更新/删除视图的操作会受到一定的限制;
所有针对视图的操作都会影响到视图的基表;
为了防止用户通过视图间接修改基表的数据,
可以将视图创建为只读视图(带上with read only选项)

 

二. 视图的作用

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

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

3)执行某些必须使用视图的查询.
某些查询必须借助视图的帮助才能完成. 比如,
有些查询需要连接一个分组统计后的表和另一表, 这时就可以先基于分组统计的结果创建一个视图,
然后在查询中连接这个视图和另一个表就可以了;

4)提供某些安全性保证.
视图提供了一种可以控制的方式, 即可以让不同的用户看见不同的列,
而不允许访问那些敏感的列, 这样就可以保证敏感数据不被用户看见;

*      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