热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

数据库视图详解

数据库视图详解

数据库视图详解 - 定义: 视图(View)是从一个或多个表(或视图)导出的表。视图与表(有时为与视图区别,也称表为基本表——Base Table)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,

数据库视图详解

- 定义:

视图(View)是从一个或多个表(或视图)导出的表。视图与表(有时为与视图区别,也称表为基本表——Base Table)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。

视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化

- 视图的创建

SQL Server创建视图的语法:


CREATE VIEW  

[  .] [  .]  

    view_name [ ( column [ ,...n ] ) ]  

   [ WITH  [ ,...n ] ]  

AS  

select_statement   
   [ WITH CHECK OPTION ]  

 ::=  

 { ENCRYPTION | SCHEMABINDING |  

      VIEW_METADATA }  

WITH check OPTION 表示对视图进行UPDATE、INSERT、delete操作时要保证更新、删除、或插入的行满足视图定义中的谓词条件
  • 例1:建立显示年龄大于20岁的学生学号、姓名、性别等信息的S_view1
create view S_view1   
as  
select sno,sname,sex 
from s 
where age>20  ;
  • 例2:创建v_score1,要求基本表来源:S,C,SC;选择的字段为:S表中的sno、sname;C表中的cname及SC表中score;要求查询的数据为学号为20030001的学生的考试成绩。

create view v_score1  
As  
Select s.sno,s.sname,c.cname,sc.score  
From s,c,sc  
Where s.sno=sc.sno and c.cno=sc.cno and sno=  “  20030001”  ;
  • 例3:建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生
Create view IS_Student
AS
select Sno,Sname,Sage
from Student
where Sdept='IS'
with check option;
    在上述视图上加了with check option子句,以后对该视图进行插入、修改和删除操作时,RDBMS都会自动加上Sdept='IS'

行列子集视图: 如果一个视图只是从单个基本表导出的,并且只是去掉了某些行列,但保留了主键,称之为行列子集视图如上面例1和例3就是一个行列子集视图

- 查询视图

视图定义好之后就可以像对基本表一样进行查询了

  • 例 4 在信息系学生中查找年龄小于20的
select Sno,Sage
from IS_Student
where Sage<20;

对应的转换后的语句为

select Sno,Sage
from Student
where Sdept='IS' and Sage<20;

有时候,单单一个视图并不能查询到需要的数据,如例5

  • 例5 查询选修了1号课程的信息系学生
select IS_Student.Sno,Sname
from IS_Student,SC
where IS_Student.Sno=SC.Sno and SC.Cno='1';

上述查询涉及视图IS_Student和基本表SC共同查询得到结果

- 更新视图

更新视图是指通过视图来插入、删除和修改数据

由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。所以为了防止用户对数据有意无意的操作,可在定义视图时加上 with check option 如例3

  • 例 6 将信息系学生视图IS_Student 好、中学号为200215122的学生姓名改为"张大屁"
Update IS_Student
set Sname='张大屁'
where Sno='2000215122';

转换后对应的语句为

Update Student
set Sname='张大屁'
where Sno='200215122' and Sdept='IS';
  • 例7 向信息系学生视图中插入一个新的学生记录 学号为200215129 姓名为 ‘李红’ 年龄为21
insert into
IS_Student
values('200215129','李红',21);

转换后的语句为

insert into 
Student(Sno.Sname,Sage,Sdept)
values('200215129','李红',21,'IS');
  • 例8 删除信息系学生学号为200215111的学生
delete 
from IS_Student
where Sno='200215111';

转换后的语句为

delete
from Student
where Sno='200215111' and Sdept='IS';

视图更新的限制

如果视图定义中有如下子句则不能更新

  • 分组 使用group by 和 Having
  • 联结
  • 子查询
  • 并集
  • 聚集函数 MAX MIN COUNT AVG
  • DISTINCT
  • 导出列

- 视图的删除

视图删除&#26684;式为

DROP VIEW <视图名> [CASCADE] ;

视图删除后视图的定义将从数据字典中删除,使用CASCADE是级联删除,删除此视图上导出的视图

  • 例9 删除视图IS_Student
Drop VIEW IS_Student;

- 视图的优点

- 1简化用户操作

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

- 2对重构数据库提供了一定程度上的逻辑独立性

视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。 

- 3安全性

 通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。 

视图的缺点

● 性能:SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。

● 修改限制:当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。

推荐阅读
  • 基于Java的学生宿舍管理系统设计
    本论文探讨了如何利用Java技术设计和实现一个高效的学生宿舍管理系统。该系统旨在提高宿舍管理的效率,减少人为错误,同时增强用户体验。通过集成用户认证、数据管理和查询功能,系统能够满足学校宿舍管理的多样化需求。 ... [详细]
  • 尽管PHP是一种强大且灵活的Web开发语言,但开发者在使用过程中常会陷入一些典型的陷阱。本文旨在列出PHP开发中最为常见的10种错误,并提供相应的预防建议。 ... [详细]
  • 本文介绍了MySQL数据库的安全权限管理思想及其制度流程,涵盖从项目开发、数据库更新到日常运维等多个方面的详细流程控制,旨在通过严格的流程管理和权限控制,有效预防数据安全隐患。 ... [详细]
  • 当您的笔记本电脑出现无法正常关机的情况时,可以通过多种方法进行排查和修复,包括检查声音文件、减少启动程序、调整电源管理设置等。 ... [详细]
  • 今天发现Mysql的主从数据库没有同步先上Master库:mysqlshowprocesslist;查看下进程是否Sleep太多。发现很正常。showmaster ... [详细]
  • 本文探讨了在渗透测试中信息收集阶段使用的几种端口扫描技术,包括nmap、masscan、socket、telnet及nc等工具的应用与比较。 ... [详细]
  • 近期,谷歌公司的一名安全工程师Eduardo Vela在jQuery Mobile框架中发现了一项可能引发跨站脚本攻击(XSS)的安全漏洞。此漏洞使得使用jQuery Mobile的所有网站面临潜在的安全威胁。 ... [详细]
  • addcslashes—以C语言风格使用反斜线转义字符串中的字符addslashes—使用反斜线引用字符串bin2hex—函数把包含数据的二进制字符串转换为十六进制值chop—rt ... [详细]
  • 本文整理了一系列Java面试问题,涵盖Java开发环境的分类、Java语言的核心特性、Linux环境下Java SE的安装步骤、常用的Java开发工具介绍,以及类与对象的基本概念等。 ... [详细]
  • 探讨GET与POST请求数据传输的最大容量
    在Web开发领域,GET和POST是最常见的两种数据传输方法。本文将深入探讨这两种请求方式在不同环境下的数据传输能力及其限制。 ... [详细]
  • 本文详细介绍了一个既适用于PHP5也适用于PHP7的cURL文件上传解决方案。此示例源于项目需求,旨在通过cURL实现文件上传功能,并解决不同PHP版本间的兼容性问题。 ... [详细]
  • 计算机架构基础 —— 冯·诺依曼模型
    本文探讨了计算机科学的基础——冯·诺依曼体系结构,介绍了其核心概念、发展历程及面临的挑战。内容涵盖早期计算机的发展、图灵机的概念、穿孔卡的应用、香农定理的重要性以及冯·诺依曼体系结构的具体实现与当前存在的瓶颈。 ... [详细]
  • 本文将详细介绍Docker的网络架构,包括Docker自带的几种网络模式及其创建方法,探讨容器间及容器与外部世界的通信方式。此外,还将简要介绍单主机环境下的容器网络配置。 ... [详细]
  • 深入探讨ASP.NET中的OAuth、JWT与OpenID Connect
    本文作为前文关于OAuth2.0和使用.NET实现OAuth身份验证的补充,详细阐述了OAuth与JWT及OpenID Connect之间的关系和差异,旨在提供更全面的理解。 ... [详细]
  • 如何高效优化系统加载进度条
    本文介绍了多种方法来优化计算机的启动和运行过程中的加载进度条,包括硬件调整、系统设置优化等,旨在提升用户体验。 ... [详细]
author-avatar
假发cat时代
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有