视图的基本概念

视图是从一个或几个基本表(或者视图)导出的表。它与基本表不同,是一个虚表。

数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。

视图一经定义,就可以和基本表一样被查询、被删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。

视图的优点

视图相比基本表有以下优点:

1.视图能够简化用户的操作

视图机制用户可以将注意力集中在所关心的数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的数据查询操作。

2.视图是用户能以不同的角度看待同样的数据。

对于固定的一些基本表,我们可以给不同的用户建立不同的视图,这样不同的用户就可以看到自己需要的信息了。

3.视图对重构数据库提供了一定程度的逻辑性。

比如原来的A表被分割成了B表和C表,我们仍然可以在B表和C表的基础上构建一个视图A,而使用该数据表的程序可以不变。

4.视图能够对机密数据提供安全保护

比如说,每们课的成绩都构成了一个基本表,但是对于每个同学只可以查看自己这门课的成绩,因此可以为每个同学建立一个视图,隐藏其他同学的数据,只显示该同学自己的数据。

5.适当的利用视图可以更加清晰的表达查询

有时用现有的视图进行查询可以极大的减小查询语句的复杂程度。

说明:本文章中的用来作为示例的数据表有三个:student、course、sc 数据表具体请看:Mysql数据库中的EXISTS和NOT EXISTS

建立视图

SQL视图建立命令


CREATE VIEW <视图名>[(<列名>[,<列名>]…)]

AS <子查询>

[WITH  CHECK  OPTION];

其中,子查询可以是任意复杂的SELECT语句,但通常不允许包含ORDER BY子句和DISTINCT短语(因为子查询是中间结果)。

组成视图的属性列名可以全部省略或全部指定,如果省略,则隐含由子查询中SELECT目标列中的诸字段组成;
但在下列情况下必须明确指定视图的所有列名:

(1)某个目标列不是单纯的属性名,而是聚集函数或列表达式,或者目标列为*

(2)多表连接时选出了几个同名列作为视图的字段

(3)需要在视图中为某个列启用新的更合适的名字


RDBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。在对视图查询时,按视图的定义从基本表中将数据查出。

建立的视图可以简单的分为以下三类:

行列子集视图

若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,我盟称这类视图为行列子集视图

例子1.1

建立信息系学生的视图
SQL语句:
CREATE VIEW IS_Student
AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept= 'IS'

本例中省略了视图IS_Student的列名,隐含了由子查询中SELECT子句中的三个列名组成。



WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)
例子1.2
 建立信息系学生的视图,并要求透过该视图进行的更新操作只涉及信息系学生
SQL语句:
CREATE VIEW IS_Student
AS SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept= 'IS'
WITH CHECK OPTION;

由于在定义IS_Student视图时加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,RDBMS会自动加上Sdept='IS'的条件:

  • 插入操作:DBMS自动检查Sdept属性值是否为'IS'

    • 如果不是,则拒绝该插入操作
    • 如果没有提供Sdept属性值,则自动定义Sdept为'IS'
  • 修改操作:DBMS自动加上Sdept= 'IS'的条件
  • 删除操作:DBMS自动加上Sdept= 'IS'的条件

视图不仅可以建立在单个基本表上,也可以建立在多个基本表上,或者建立在基本表和视图的基础上。

例子1.3 建立信息系选修了1号课程的学生视图

CREATE VIEW IS_S1(Sno, Sname, Grade)
AS SELECT Student.Sno, Sname, Grade
FROM Student, SC
WHERE Sdept= 'IS' AND
Student.Sno=SC.Sno AND
SC.Cno= '1';



例子1.4建立信息系选修了1号课程且成绩在90分以上的学生的视图

CREATE VIEW IS_S2
AS SELECT Sno, Sname, Grade
FROM IS_S1
WHERE Grade>=90;

带表达式的视图

定义基本表时,为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。
但由于视图中的数据并不实际存储,所以定义视图时可以根据应用的需要,设置一些派生属性列。
这些派生属性列由于在基本标中并不实际存在也称他们为虚拟列,带虚拟列的视图也称为带表达式的视图

例子2.1 定义一个反映学生出生年份的视图

CREATE  VIEW BT_S(Sno, Sname, Sbirth)
AS SELECT Sno, Sname, 2000-Sage
FROM Student;

分组视图

还可以用带有聚集函数和GROUP BY子句的查询来定义视图,这种视图称为分组视图。
例子3.1将学生的学号及他的平均成绩定义为一个视图
CREATE VIEW S_G(Sno, Gavg)
AS SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno;

由于AS子语句中SELECT语句语句的目标列平均成绩是通过作用聚集函数得到的,所以CREATE VIEW中必须明确定义组成S_G视图的每个属性列名,S_G是一个分组视图。

例子3.2将Student表中所有女生记录定义为一个视图
CREATE VIEW  F_Student1(stdnum, name, sex, age, dept)
AS SELECT * FROM Student WHERE Ssex='女';

这里的视图F_Student1是由子查询“SELECT *”建立的,需要明确定义组成F_Student1视图的每个属性列名。


查询视图

视图定义以后,用户就可以像查询基本表一样查询视图了。
因此从用户角度看,查询视图与查询基本表相同。
不过,所有对视图的查询,都会被数据库管理软件解释成对基本数据表的查询,因为视图是在基本表的基础上抽象出来的。
例子4.1在信息系学生的视图中找出年龄小于20岁的学生
SELECT Sno, Sage
FROM IS_Student
WHERE Sage<20;

IS_Student视图的定义(视图定义例1):
CREATE VIEW IS_Student
AS SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept= 'IS';

DBMS转换后的查询语句为:

SELECT Sno, Sage
FROM Student
WHERE Sdept='IS' AND Sage<20;

更新视图

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


由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。


从用户角度看,更新视图与更新基本表相同;RDBMS将之转化为对基本表的更新操作。


为防止用户通过视图对数据进行更新时,有意无意地对不属于视图范围内的基本表数据进行操作,可以在定义视图时加上WITH CHECK OPTION子句。
这样在视图上增删改数据时,RDBMS会检查视图定义中的条件,若不满足条件,则拒绝执行该操作。

例子5.1将信息系学生视图IS_Student中学号95002的学生姓名改为“刘辰”
UPDATE IS_Student
SET Sname='刘辰'
WHERE Sno='95002';

转换后的语句:

UPDATEStudent
SET Sname='刘辰'
WHERE Sno='95002' AND Sdept='IS';

在关系数据库中,并不是所有的视图都是可更新的,因为有些视图的更新不能唯一地有意义地转换成对相应基本表的更新。



一般地,行列子集视图是可更新的,除此之外,还有一些视图理论上是可更新的,但他们的确切特征还是尚待研究的课题,还有些视图从理论上就是不可更新的。




删除视图

删除视图的语句格式:DROP VIEW <视图名>;
删除视图对生成视图的基本表没有任何影响。
删除基表时,由该基表导出的所有视图定义没有被删除,但已不能使用,必须使用DROP VIEW显式删除。
例子6.1

删除视图BT_S:

DROP VIEW BT_S;

删除视图IS_S1:

DROP VIEW IS_S1;

MySql中的视图的概念及应用的更多相关文章

  1. Mysql中的视图

    什么是视图 通俗的讲,视图就是一条SELECT语句执行后返回的结果集.所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上. 视图的特性 视图是对若干张基本表的引用,一张虚表,查询语句执 ...

  2. 在Navicat for MySQL中打开视图时,提示视图没有主键的问题

    一直把视图理解为一个select语句而已,视图一般就是用于查询,不会通过视图来更新表或视图本身的数据,所以视图根本不需要什么主键.今天自己建了一个视图view_test: drop view if e ...

  3. MySQL中的视图详解

    一.什么是视图? 简单来说,视图就是从一张表中导出的虚拟表.视图拥有表的结构,但是在数据库中只有视图的定义,但是没有视图中的数据. 视图是由查询语句从一张表中导出来的数据,不是一张实际的表. 二.视图 ...

  4. mysql中的视图、事务和索引

    视图: 对于一个sql查询,如果发生了修改,就需要修改sql语句. 我们可以通过定义视图来解决问题.改变需求之后就改变视图. 视图是对查询的封装 定义视图: create view 视图名称 as s ...

  5. mysql中查看视图的元数据?

    需求描述: 查看视图的元数据的方法. 操作过程: 1.通过查看information_schema数据库下的views表来查看视图的定义语句 mysql> select definer,view ...

  6. postgres中的视图和物化视图

    视图和物化视图区别 postgres中的视图和mysql中的视图是一样的,在查询的时候进行扫描子表的操作,而物化视图则是实实在在地将数据存成一张表.说说版本,物化视图是在9.3 之后才有的逻辑. 比较 ...

  7. MySQL中SQL语句2

    上一片介绍了一些基本的SQL的增删改查,这一片会介绍一些进阶的SQL语句使用. MySQL中的视图 视图是什么?当我们总是查询几张表的某个字段时,可以创建一张虚拟表,把这几个字段写入这个虚拟的表,这样 ...

  8. MySQL基础之 视图

    视图 视图就是从一个表或多个表导出来的一张虚拟的表.通过这个窗口可以看到系统专门提供的数据,方便用户操作的同时增加了安全性. 视图的特点: 1.视图的列可以来自于不同的表. 2.视图是由实际存在的表创 ...

  9. Mysql学习笔记—视图

    1.什么是视图 视图(View)是一种虚拟存在的表.其内容与真实的表相似,包含一系列带有名称的列和行数据.但是视图并不在数据库中以存储的数据的形式存在.行和列的数据来自定义视图时查询所引用的基本表,并 ...

随机推荐

  1. Data Structure Array: Find the Missing Number

    http://www.geeksforgeeks.org/find-the-missing-number/ 1. use sum formula, O(n), O(1) 2. use XOR, O(n ...

  2. Python 3 接口与归一化设计

    一.接口与归一化设计: 1.归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度. 2.归一化使得高层的外部使用者可以不加区分的处理所有接口兼 ...

  3. java常用注解(更新中)

    注解根据来源可分为: 系统注解(自带的,取决于JDK版本).自定义注解及第三方注解 系统注解根据用途又可分为: java内置注解和元注解 根据运行机制(保留到什么时候)可分为: 源码注解.编译注解和运 ...

  4. keeplive使用

    一.简介 Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层.第4层和第7层交换机的功能.主要提供loadbalancing( ...

  5. php中删除数组的第一个元素和最后一个元素的函数

    对于一个php数组,该如何删除该数组的第一个元素或者最后一个元素呢?其实这两个过程都可以通过php自带的函数 array_pop 和 array_shift 来完成,下面就具体介绍一下如何来操作. ( ...

  6. hive启动时 Terminal initialization failed; falling back to unsupported java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected

    错误提示信息如下 [ERROR] Terminal initialization failed; falling back to unsupported java.lang.IncompatibleC ...

  7. 红米.USB安装_无法打开

    1.必须有 SIM卡,才能打开 USB安装 红米1s(miui8.5)就是这样 2. 3. 4. 5.

  8. BZOJ 2431 [HAOI2009]逆序对数列:dp 逆序对

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2431 题意: 给定n,k,问你有多少个由1~n组成的排列,使得逆序对个数恰好为k个. 题解 ...

  9. 单机版 RedisUtils({基本操作封装工具类})【三】

    <!--集成的RedisJAR--> <!--引入jedis需的jar包--> <dependency> <groupId>redis.clients& ...

  10. error: reference to 'max' is ambiguous

    1.     自定义的变量名    与      库中的      重名了