精华内容
下载资源
问答
  • top 100 percent * 转载于:https://www.cnblogs.com/ooip/p/4897310.html

    top 100 percent *

    转载于:https://www.cnblogs.com/ooip/p/4897310.html

    展开全文
  • 视图定义: 基于多表的预定义查询,这些表称为基表 可以通过视图对基表进行DML操作 视图检索信息与从基表检索信息方法完全相同注意:视图不存在数据,算是个虚表,视图只会访问基表的行适用于:检查...

    视图
    视图定义:
    基于多表的预定义查询,这些表称为基表
    可以通过视图对基表进行DML操作
    在视图中检索信息与从基表中检索信息方法完全相同

    注意:视图不存在数据,算是个虚表,视图只会访问基表的行

    适用于:检查检索数据

    优点:
    限制用户只能通过视图检索数据,使用户看不到底层基表
    将复杂查询编写为视图,降低sql的复杂性
    限制用户只能访问基表的部分数据,实现安全性

    创建视图
    create [or replace] [force| noforcce] view 视图名【(别名,【别名】….)】
    as
    子查询(不能包含order by)
    【with {check option | read only }【constraint 约束名】】

    force:如果基表不存在,创建视图就会失败。但是可以使用force选项强制创建视图

    noforcce:基表存在,才能创建视图

    with check option :所插入的数据或者修改的数据行必须满足视图定义的约束条件,也就是说子查询的数据在插入视图中时,必须满足视图定义的约束条件
    约束条件为子查询定义的where 条件
    这里写图片描述
    这里写图片描述

    with read only :保证该视图不能进行任何的DML操作

    replace:如果有视图存在,就替换

    案列

    这里写图片描述

    这里写图片描述

    注意:子查询可以多表连接,返回的结果作为视图的数据

    视图的表结构
    desc + 视图名
    这里写图片描述

    创建视图的语句
    select view_name,text from user_views;
    view_name:视图名
    text :创建视图的语句
    这里写图片描述

    查看视图哪些列是可以进行DML操作
    select column_name,updatable,insertable,deletable from user_updatable_columns
    where table_name=upper(‘vstu’);
    table_name:视图名称

    这里写图片描述

    展开全文
  • 视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表,这些修改必须服从基表的完整性约束,并同样会触发定义在基表上的触发器。(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束)  2.视图的...
    1.视图的概述 
    

    视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表。视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义在基表上的触发器。(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束) 

    2.视图的存储  

    与表不同,视图不会要求分配存储空间,视图中也不会包含实际的数据。视图只是定义了一个查询,视图中的数据是从基表中获取,这些数据在视图被引用时动态的生成。由于视图基于数据库中的其他对象,因此一个视图只需要占用数据字典中保存其定义的空间,而无需额外的存储空间。 

    3.视图的作用 

    用户可以通过视图以不同形式来显示基表中的数据,视图的强大之处在于它能够根据不同用户的需要来对基表中的数据进行整理。视图常见的用途如下: 

    通过视图可以设定允许用户访问的列和数据行,从而为表提供了额外的安全控制 

    隐藏数据复杂性 

    视图中可以使用连接(join),用多个表中相关的列构成一个新的数据集。此视图就对用户隐藏了数据来源于多个表的事实。 
      
    简化用户的SQL 语句  

    用户使用视图就可从多个表中查询信息,而无需了解这些表是如何连接的。 
      
    以不同的角度来显示基表中的数据 

    视图的列名可以被任意改变,而不会影响此视图的基表 
      
    使应用程序不会受基表定义改变的影响 

    在一个视图的定义中查询了一个包含4 个数据列的基表中的3 列。当基表中添加了新的列后,由于视图的定义并没有被影响,因此使用此视图的应用程序也不会被影响。 
      
    保存复杂查询  

    一个查询可能会对表数据进行复杂的计算。用户将这个查询保存为视图之后,每次进行类似计算只需查询此视图即可。 
    逻辑数据独立性 

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

    视图的定义就是其使用的查询语句,Oracle 将这个定义以文本形式存储在数据字典中。当用户在 SQL 语句中引用了视图时,Oracle 将进行以下工作: 

    将引用了视图的语句与视图的定义语句整合为一个语句 
    在共享SQL 区解析整合后的语句 
    执行此语句 
    当现有的共享SQL 区中没有与整合后的语句一致时,Oracle 才会为此语句创建新的共享SQL 区。因此,引用了视图的SQL 语句也能够利用已有的共享 SQL 区以达到节约内存和提高性能的目的。 

    5.视图的依赖性  

    由于视图的定义是一个引用了其他对象(表,视图)的查询,因此视图依赖于其所引用的对象。Oracle 会自动地处理视图的依赖性。例如,当用户移除了一个视图的基表后再重建此表,Oracle 将检查新的基表是否符合视图的定义并判断视图的有效性。 

    6.可更新的连接视图  

    连接视图是指在一个视图的定义查询的from字句中引用了多个表或视图。而可更新的连接视图是指能够执行 UPDATE,INSERT,和 DELETE 操作的连接视图。为了保证视图是可更新的,其定义中不能包含以下语法结构: 

    集合操作符 
    DISTINCT 操作符 
    聚合函数或分析型函数 
    GROUP BY,ORDER BY,CONNECT BY,或 START WITH 字句 
    在 SELECT 之后的列表中使用集合表达式 
    在 SELECT 之后的列表中使用子查询 
    连接(join)(但是有例外情况) 
    对于不可更新的视图,可以利用 INSTEAD OF 触发器对其数据进行修改。
    展开全文
  • MySQL中视图定义、原理和如何使用、创建

    万次阅读 多人点赞 2016-05-26 09:56:24
    林炳文Evankaka原创作品。转载请注明出处...  摘要:本文主要讲了  林炳文Evankaka原创作品。...  摘要:本文主要讲了MySQL中视图定义、原理和如何使用、创建、删除等 一. 视图概述


             林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

           摘要:本文主要讲了MySQL中视图的定义、原理和如何使用、创建、删除等

    一. 视图概述

            视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
            对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。
           视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。这个视图就像一个“窗口”,从中只能看到你想看的数据列。这意味着你可以在这个视图上使用SELECT *,而你看到的将是你在视图定义里给出的那些数据列:

    既然视图的定义是基于基本表的,哪为什么还要定义视图呢?这是因为合理地使用视图能够带来许多好处:
    1、 视图能简化用户操作
           视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐藏起来了。换句话说,用户所作的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。
    2、 视图使用户能以多种角度看待同一数据
          视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。
    3、 视图对重构数据库提供了一定程度的逻辑独立性
          数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。
    在关许数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系Student(Sno,Sname,Ssex,Sage,Sdept),
    分为SX(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)两个关系。这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:

    [sql]  view plain  copy
    1. CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)AS SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept FROM SX,SY WHERE SX.Sno=SY.Sno;  
         这样尽管数据库的逻辑结构改变了(变为SX和SY两个表了),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。
    当然,视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。
    4、视图能够对机密数据提供安全保护
           有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应该看到这些数据的用户视图上。这样视图机制就自动提供了对机密数据的安全保护功能。例如,Student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本原系学生视图。
    5、适当的利用视图可以更清晰地表达查询
           例如经常需要执行这样的查询“对每个学生找出他获得最高成绩的课程号”。可以先定义一个视图,求出每个同学获得的最高成绩:
    [sql]  view plain  copy
    1. CREATE VIEW VMGRADE  
    2. AS  
    3. SELECT Sno,MAX(Grade) Mgrade  
    4. FROM SC  
    5. GROUP BY Sno  
    然后用如下的查询语句完成查询:
    [sql]  view plain  copy
    1. SELECT SC.Sno,Cno FROM SC,VMGRADE WHERE SC.Sno = VMGRADE.Sno AND SC.Grade = VMGRADE.Mgrade;  

    二、数据准备

    1、员工表

    [sql]  view plain  copy
    1. CREATE TABLE t_employee(  
    2.         ID INT  PRIMARY KEY  AUTO_INCREMENT,  
    3.         NAME CHAR(30) NOT NULL,  
    4.         SEX  CHAR(2) NOT NULL,  
    5.         AGE INT NOT NULL,  
    6.         DEPARTMENT CHAR(10) NOT NULL,  
    7.         SALARY  INT NOT NULL,  
    8.         HOME CHAR(30),  
    9.         MARRY CHAR(2) NOT NULL DEFAULT  '否',         
    10.         HOBBY CHAR(30)  
    11.  );  

    插入数据:

    [sql]  view plain  copy
    1. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'小红','女',20,'人事部','4000','广东','否','网球');  
    2. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'明日','女',21,'人事部','9000','北京','否','网球');  
    3. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'天天','男',22,'研发部','8000','上海','否','音乐');  
    4. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'大大','女',23,'研发部','9000','重庆','否','无');  
    5. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'王下','女',24,'研发部','9000','四川','是','足球');  
    6. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'无名','男',25,'销售部','6000','福建','否','游戏');  
    7. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'不知道','女',26,'销售部','5000','山西','否','篮球');  
    插入的结果:


    然后再定义一张员工信息表:

    [sql]  view plain  copy
    1. create TABLE t_employee_detail(  
    2. ID INT PRIMARY KEY,  
    3. POS CHAR(10) NOT NULL,  
    4. EXPERENCE CHAR(10) NOT NULL,  
    5. CONSTRAINT `FK_ID` FOREIGN KEY(ID) REFERENCES t_employee(ID)  
    6. )  

    插入如下:

    [sql]  view plain  copy
    1. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(1,'人事管理','工作二年');  
    2. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(2,'人事招聘','工作二年');  
    3. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(3,'初级工程师','工作一年');  
    4. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(4,'中级工程师','工作二年');  
    5. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(5,'高级工程师','工作三年');  
    6. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(6,'销售代表','工作二年');  
    7. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(7,'销售员','工作一年');  
    内容:


    三、使用案例

    1. 语法

    CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW [db_name.]view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]

         通过该语句可以创建视图,若给定了[OR REPLACE],则表示当已具有同名的视图时,将覆盖原视图。select_statement是一个查询语句,这个查询语句可从表或其它的视图中查 询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。
    表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复。

    在创建视图前应先看看是否有权限:

    [sql]  view plain  copy
    1. SELECT SELECT_priv,create_view_priv from mysql.user WHERE user='root'  

    Y表示有创建的权限


    2、单表上创建视图

    在员工表是创建视图

    [sql]  view plain  copy
    1. CREATE VIEW V_VIEW1(ID, NAME, SEX, AGE,DEPARTMENT) AS SELECT ID, NAME, SEX, AGE,DEPARTMENT FROM learning.t_employee;  

    然后是显示内容:

    [sql]  view plain  copy
    1. SELECT * FROM V_VIEW1  


    3、多表上创建视图

    [sql]  view plain  copy
    1. CREATE VIEW V_VIEW2(ID, NAME, SEX, AGE,DEPARTMENT,POS,EXPERENCE) AS SELECT a.ID, a.NAME, a.SEX, a.AGE,a.DEPARTMENT,b.POS,b.EXPERENCE FROM learning.t_employee a,learning.t_employee_detail b WHERE a.ID=b.ID;  

    显示结果 
    [sql]  view plain  copy
    1. SELECT * FROM V_VIEW2  


    4、查看视图

    (1)DESCRIBE 命令

    [sql]  view plain  copy
    1. DESCRIBE V_VIEW2  


    (2)SHOW TABLE STATUS 

    [sql]  view plain  copy
    1. show TABLE status LIKE 'V_VIEW2'  


    (3)SHOW CREATE view命令

    [sql]  view plain  copy
    1. show CREATE view V_VIEW2  



    5、修改视图

    (1)CREATE OR REPLACE命令

    [sql]  view plain  copy
    1. CREATE OR REPLACE VIEW V_VIEW1(ID, NAME, SEX) AS SELECT ID, NAME, SEX  FROM learning.t_employee;  



    (2) ALTER 命令

    [sql]  view plain  copy
    1. ALTER VIEW  V_VIEW1(ID, NAMEAS SELECT ID, NAME  FROM learning.t_employee;  
    2. SELECT * FROM learning.v_view1  



    6、更新视图

    在MySQL中,更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟表,其中没有数据,所以通过视图更新时,都是转换到基本表来更新。
    更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。

    更新前:


    更新后:

    [sql]  view plain  copy
    1. UPDATE V_VIEW2 SET POS='高级工程师' WHERE NAME='天天'  



    对应 的真实表上的数据也发生改变 了

    [sql]  view plain  copy
    1. SELECT * FROM learning.t_employee_detail WHERE t_employee_detail.ID=3  



    不可更新的视图:
    某些视图是可更新的。也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:

    · 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。
    · DISTINCT
    · GROUP BY
    · HAVING
    · UNION或UNION ALL
    · 位于选择列表中的子查询
    · Join
    · FROM子句中的不可更新视图
    · WHERE子句中的子查询,引用FROM子句中的表。
    · 仅引用文字值(在该情况下,没有要更新的基本表)。
    · ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。

    注意

    视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。

    CASCADED和LOCAL能不能决定视图是否能更新?
    WITH[CASCADED|LOCAL] CHECK OPTION能不能决定视图是否能更新?这两个参数的基本定义如下:
    LOCAL参数表示更新视图时只要满足该视图本身定义的条件即可。
    CASCADED参数表示更新视图时需要满足所有相关视图和表的条件。没有指明时,该参数为默认值。

    With check option的用法:
    (with check option对于没有where条件的视图不起作用的)

    [sql]  view plain  copy
    1. CREATE VIEW V_VIEW3(ID, NAME,SEX,AGE,DEPARTMENT,SALARY, HOME, MARRY, HOBBY) AS SELECT ID, NAME, SEX,AGE,DEPARTMENT,SALARY,HOME,MARRY,HOBBY FROM learning.t_employee WHERE DEPARTMENT='人事部' WITH LOCAL CHECK OPTION;  
    表示只限定插入部门为人事部的人。



    然后插入一条:

    [sql]  view plain  copy
    1. INSERT INTO learning.V_VIEW3(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'会会会会','女',20,'人事部','4500','广东','否','网球');  
    看下结果:
    [sql]  view plain  copy
    1. SELECT * FROM learning.V_VIEW3  


    同时看真实表中的数据:


    再来插入一条:

    [sql]  view plain  copy
    1. INSERT INTO learning.V_VIEW3(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'qqqqvasvas','女',20,'研发部','4500','上海','否','网球');  


    结果显示插入失败
    对于with check option用法,总结如下:
    通过有with check option选项的视图操作基表(只是面对单表,对连接多表的视图正在寻找答案),有以下结论: 插入后的数据,通过视图能够查询出来就符合WITH CHECK OPTION 否则就不符合;
    首先视图只操作它可以查询出来的数据,对于它查询不出的数据,即使基表有,也不可以通过视图来操作。
    1.对于update,有with check option,要保证update后,数据要被视图查询出来
    2.对于delete,有无with check option都一样
    4.对于insert,有with check option,要保证insert后,数据要被视图查询出来
    对于没有where 子句的视图,使用with check option是多余的

    7、删除视图

    [sql]  view plain  copy
    1. DROP VIEW IF EXISTS 视图名  

    一. 视图概述

            视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
            对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。
           视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。这个视图就像一个“窗口”,从中只能看到你想看的数据列。这意味着你可以在这个视图上使用SELECT *,而你看到的将是你在视图定义里给出的那些数据列:

    既然视图的定义是基于基本表的,哪为什么还要定义视图呢?这是因为合理地使用视图能够带来许多好处:
    1、 视图能简化用户操作
           视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐藏起来了。换句话说,用户所作的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。
    2、 视图使用户能以多种角度看待同一数据
          视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。
    3、 视图对重构数据库提供了一定程度的逻辑独立性
          数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。
    在关许数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系Student(Sno,Sname,Ssex,Sage,Sdept),
    分为SX(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)两个关系。这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:

    [sql]  view plain  copy
    1. CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)AS SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept FROM SX,SY WHERE SX.Sno=SY.Sno;  
         这样尽管数据库的逻辑结构改变了(变为SX和SY两个表了),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。
    当然,视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。
    4、视图能够对机密数据提供安全保护
           有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应该看到这些数据的用户视图上。这样视图机制就自动提供了对机密数据的安全保护功能。例如,Student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本原系学生视图。
    5、适当的利用视图可以更清晰地表达查询
           例如经常需要执行这样的查询“对每个学生找出他获得最高成绩的课程号”。可以先定义一个视图,求出每个同学获得的最高成绩:
    [sql]  view plain  copy
    1. CREATE VIEW VMGRADE  
    2. AS  
    3. SELECT Sno,MAX(Grade) Mgrade  
    4. FROM SC  
    5. GROUP BY Sno  
    然后用如下的查询语句完成查询:
    [sql]  view plain  copy
    1. SELECT SC.Sno,Cno FROM SC,VMGRADE WHERE SC.Sno = VMGRADE.Sno AND SC.Grade = VMGRADE.Mgrade;  

    二、数据准备

    1、员工表

    [sql]  view plain  copy
    1. CREATE TABLE t_employee(  
    2.         ID INT  PRIMARY KEY  AUTO_INCREMENT,  
    3.         NAME CHAR(30) NOT NULL,  
    4.         SEX  CHAR(2) NOT NULL,  
    5.         AGE INT NOT NULL,  
    6.         DEPARTMENT CHAR(10) NOT NULL,  
    7.         SALARY  INT NOT NULL,  
    8.         HOME CHAR(30),  
    9.         MARRY CHAR(2) NOT NULL DEFAULT  '否',         
    10.         HOBBY CHAR(30)  
    11.  );  

    插入数据:

    [sql]  view plain  copy
    1. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'小红','女',20,'人事部','4000','广东','否','网球');  
    2. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'明日','女',21,'人事部','9000','北京','否','网球');  
    3. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'天天','男',22,'研发部','8000','上海','否','音乐');  
    4. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'大大','女',23,'研发部','9000','重庆','否','无');  
    5. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'王下','女',24,'研发部','9000','四川','是','足球');  
    6. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'无名','男',25,'销售部','6000','福建','否','游戏');  
    7. INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'不知道','女',26,'销售部','5000','山西','否','篮球');  
    插入的结果:


    然后再定义一张员工信息表:

    [sql]  view plain  copy
    1. create TABLE t_employee_detail(  
    2. ID INT PRIMARY KEY,  
    3. POS CHAR(10) NOT NULL,  
    4. EXPERENCE CHAR(10) NOT NULL,  
    5. CONSTRAINT `FK_ID` FOREIGN KEY(ID) REFERENCES t_employee(ID)  
    6. )  

    插入如下:

    [sql]  view plain  copy
    1. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(1,'人事管理','工作二年');  
    2. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(2,'人事招聘','工作二年');  
    3. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(3,'初级工程师','工作一年');  
    4. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(4,'中级工程师','工作二年');  
    5. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(5,'高级工程师','工作三年');  
    6. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(6,'销售代表','工作二年');  
    7. INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(7,'销售员','工作一年');  
    内容:


    三、使用案例

    1. 语法

    CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW [db_name.]view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]

         通过该语句可以创建视图,若给定了[OR REPLACE],则表示当已具有同名的视图时,将覆盖原视图。select_statement是一个查询语句,这个查询语句可从表或其它的视图中查 询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。
    表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复。

    在创建视图前应先看看是否有权限:

    [sql]  view plain  copy
    1. SELECT SELECT_priv,create_view_priv from mysql.user WHERE user='root'  

    Y表示有创建的权限


    2、单表上创建视图

    在员工表是创建视图

    [sql]  view plain  copy
    1. CREATE VIEW V_VIEW1(ID, NAME, SEX, AGE,DEPARTMENT) AS SELECT ID, NAME, SEX, AGE,DEPARTMENT FROM learning.t_employee;  

    然后是显示内容:

    [sql]  view plain  copy
    1. SELECT * FROM V_VIEW1  


    3、多表上创建视图

    [sql]  view plain  copy
    1. CREATE VIEW V_VIEW2(ID, NAME, SEX, AGE,DEPARTMENT,POS,EXPERENCE) AS SELECT a.ID, a.NAME, a.SEX, a.AGE,a.DEPARTMENT,b.POS,b.EXPERENCE FROM learning.t_employee a,learning.t_employee_detail b WHERE a.ID=b.ID;  

    显示结果 
    [sql]  view plain  copy
    1. SELECT * FROM V_VIEW2  


    4、查看视图

    (1)DESCRIBE 命令

    [sql]  view plain  copy
    1. DESCRIBE V_VIEW2  


    (2)SHOW TABLE STATUS 

    [sql]  view plain  copy
    1. show TABLE status LIKE 'V_VIEW2'  


    (3)SHOW CREATE view命令

    [sql]  view plain  copy
    1. show CREATE view V_VIEW2  



    5、修改视图

    (1)CREATE OR REPLACE命令

    [sql]  view plain  copy
    1. CREATE OR REPLACE VIEW V_VIEW1(ID, NAME, SEX) AS SELECT ID, NAME, SEX  FROM learning.t_employee;  



    (2) ALTER 命令

    [sql]  view plain  copy
    1. ALTER VIEW  V_VIEW1(ID, NAMEAS SELECT ID, NAME  FROM learning.t_employee;  
    2. SELECT * FROM learning.v_view1  



    6、更新视图

    在MySQL中,更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟表,其中没有数据,所以通过视图更新时,都是转换到基本表来更新。
    更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。

    更新前:


    更新后:

    [sql]  view plain  copy
    1. UPDATE V_VIEW2 SET POS='高级工程师' WHERE NAME='天天'  



    对应 的真实表上的数据也发生改变 了

    [sql]  view plain  copy
    1. SELECT * FROM learning.t_employee_detail WHERE t_employee_detail.ID=3  



    不可更新的视图:
    某些视图是可更新的。也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:

    · 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。
    · DISTINCT
    · GROUP BY
    · HAVING
    · UNION或UNION ALL
    · 位于选择列表中的子查询
    · Join
    · FROM子句中的不可更新视图
    · WHERE子句中的子查询,引用FROM子句中的表。
    · 仅引用文字值(在该情况下,没有要更新的基本表)。
    · ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。

    注意

    视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。

    CASCADED和LOCAL能不能决定视图是否能更新?
    WITH[CASCADED|LOCAL] CHECK OPTION能不能决定视图是否能更新?这两个参数的基本定义如下:
    LOCAL参数表示更新视图时只要满足该视图本身定义的条件即可。
    CASCADED参数表示更新视图时需要满足所有相关视图和表的条件。没有指明时,该参数为默认值。

    With check option的用法:
    (with check option对于没有where条件的视图不起作用的)

    [sql]  view plain  copy
    1. CREATE VIEW V_VIEW3(ID, NAME,SEX,AGE,DEPARTMENT,SALARY, HOME, MARRY, HOBBY) AS SELECT ID, NAME, SEX,AGE,DEPARTMENT,SALARY,HOME,MARRY,HOBBY FROM learning.t_employee WHERE DEPARTMENT='人事部' WITH LOCAL CHECK OPTION;  
    表示只限定插入部门为人事部的人。



    然后插入一条:

    [sql]  view plain  copy
    1. INSERT INTO learning.V_VIEW3(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'会会会会','女',20,'人事部','4500','广东','否','网球');  
    看下结果:
    [sql]  view plain  copy
    1. SELECT * FROM learning.V_VIEW3  


    同时看真实表中的数据:


    再来插入一条:

    [sql]  view plain  copy
    1. INSERT INTO learning.V_VIEW3(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'qqqqvasvas','女',20,'研发部','4500','上海','否','网球');  


    结果显示插入失败
    对于with check option用法,总结如下:
    通过有with check option选项的视图操作基表(只是面对单表,对连接多表的视图正在寻找答案),有以下结论: 插入后的数据,通过视图能够查询出来就符合WITH CHECK OPTION 否则就不符合;
    首先视图只操作它可以查询出来的数据,对于它查询不出的数据,即使基表有,也不可以通过视图来操作。
    1.对于update,有with check option,要保证update后,数据要被视图查询出来
    2.对于delete,有无with check option都一样
    4.对于insert,有with check option,要保证insert后,数据要被视图查询出来
    对于没有where 子句的视图,使用with check option是多余的

    7、删除视图

    [sql]  view plain  copy
    1. DROP VIEW IF EXISTS 视图名  
    展开全文
  • MySQL--视图定义&操作

    千次阅读 2018-09-28 18:00:23
    视图并不数据库实际存在,行和列数据来自定义视图的查询使用的表,并且是使用视图时动态生成的。 视图相对于普通的表的优势主要包括以下几项。 简单:使用视图的用户完全不需要关心后面对应的表的结构、...
  • 视图是指计算机数据库视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不数据库以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用...
  • oracle的数据字典一般都有user、all、dba开始的三份,这里就以all开始的举例(注意权限,否则结果会很大) 1、all_tables:查询所有表相关信息 ...3、all_views:查询所有视图及视图定义语句 .
  • SQL语句之数据库之创建视图

    千次阅读 2021-03-31 23:15:58
    MySQL之创建视图
  • 数据库面试

    千次阅读 多人点赞 2019-02-13 09:03:42
    数据定义DDL:Create Table,Alter Table,Drop Table, Create/Drop Index等 数据操纵DML:Select ,insert,update,delete, 数据控制DCL:grant,revoke 2. 内联接,外联接区别? 内连接是保证两个表所有的行都要满足...
  • MySQL 面试题

    万次阅读 多人点赞 2019-09-02 16:03:33
    如果此时想要索引,可以在语句中添加强制索引。 8、列类型是字符串类型,查询时一定要给值加引号,否则索引失效。 9、 LIKE 查询, % 不能前,因为无法使用索引。如果需要模糊匹配,可以使用全文...
  • SQL Server实验——数据库视图定义与使用学生选课数据库的创建创建学生信息表student创建课程信息表course创建学生选课信息表sc插入相关信息视图的创建基本应用一、创建信息系(sdept=’IS’)学生信息的视图IS_...
  • SQLserver基础语句大全

    万次阅读 多人点赞 2019-06-09 13:17:50
    SQL 基础 结构化查询语言(Structured Query Language)简称 SQL,是一种特殊目的的编程语言, 是一种...可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。 SQL (结构化查询语言)是用于执行...
  • 创建视图SQL:SQL Server创建视图

    千次阅读 2020-07-17 13:42:32
    通过视图修改行时,此选项使我们可以控制插入到表的数据,该数据紧随视图定义中的WHERE子句。 即将到来的文章对此有更多的了解。 CREATE VIEW SQL语句 (CREATE VIEW SQL statement) Without further ado, let...
  • 使用sql语句创建视图

    千次阅读 2017-04-26 09:37:48
    create view view_name  as   查看所有视图 USE infromation_schema; SELECT*FROM view
  • Mysql Workbench使用教程

    万次阅读 多人点赞 2019-03-20 23:45:34
    弹出的对话框,Edit 菜单栏中包含三个按钮,分别为 “修改”“插入”和“删除” 。 查看数据表:  成功创建数据表后,可以查看数据表的结构信息,需要查看表结构的数据表上右击,选择 Table ...
  • 但是,要创建可更新视图定义视图的select语句不能包含以下任何元素: 聚合函数,如:min,max,sum,avg,count等。 DISTINCT子句 GROUP BY子句 HAVING子句 左连接或外连接。 UNION或UNION ALL子句 SELECT...
  • SQL语句创建视图为什么不能用order by

    千次阅读 2019-10-30 10:46:10
    很多地方都没解释清楚这个问题,有代表性的就是这个博客。 论坛上有人解释了,但是年代久远,我这里把它捞出来。答主是这位。...利用这个漏洞可以创建一个非常可笑的视图视图中,指定TOP100PERC...
  • mysql面试题

    千次阅读 2019-09-23 12:28:36
    最全MySQL面试题和答案 ...2.innodb是支持事务的存储引擎,合于插入和更新操作比较多的应用,设计合理的话是行锁(最大区别就锁的级别上),适合大数据,大并发。 数据表类型有哪些     ...
  • 实施工程师面试题(答案)

    万次阅读 多人点赞 2019-06-21 11:33:32
    1、两电脑都同一个网络环境,A 电脑访问不到 B 电脑的共享文件。此现象可能是哪些 方面所导致?怎样处理? answer:首先你要确定是不是一个工作组内,只有一个工作组内才可以共享文件,然后看一个看一看有...
  • 《数据库原理》— 数据库系统概论第五版习题解析

    万次阅读 多人点赞 2017-05-29 14:57:48
    数据库系统概论前七章习题解析 第1章绪论 ...解析现代计算机系统数据的概念是广义的。早期的计算机系统主要用于科学计算,处理的数据是整数、实数、浮点数等传统数学的数据。现代计算机能存储和...
  • 数据库面试题

    千次阅读 多人点赞 2018-05-24 10:46:20
    存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后该程序就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。 调用: 1)可以用一个命令对象...
  • Java框架总结

    万次阅读 多人点赞 2020-01-17 14:14:13
    本系列用来记录常用java框架的基本概念、区别及联系,也记录了使用过程,遇到的一些问题的解决方法,方便自己查看,也方便大家查阅。 欲速则不达,欲达则欲速! 一、SSH 1、基本概念 SSH框架是JAVA EE三种...
  • SQL CREATE VIEW 视图语句

    2019-07-15 10:56:01
    SQL 视图是基于 SQL 语句的结果集的可视化的表。 视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库的真实的表的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    测试开发笔记 第一章 测试基础 7 什么是软件测试: 7 ...验收测试:(系统测试之后) 11 回归测试: 11 4.测试过程(干什么,怎么干) 12 5.各阶段输入、输出标准以及入口、出口准则:(测试阶段过程要素) 1...
  • 【数据库学习】数据库总结

    万次阅读 多人点赞 2018-07-26 13:26:41
    数据库是长期存储计算机内、有组织的、可共享的大量数据的集合。 常见数据库管理系统有:Access、mysql、sql server 2)特点 ①数据库数据特点 永久存储、有组织、可共享。 (数据的最小存取...
  • select语句的数据源:视图

    千次阅读 2020-01-14 20:27:58
    视图中保存的仅仅是一条select语句视图中的源数据都来自于数据库表,数据库表称为基表,视图称为虚表。基表的数据发生变化时,虚表的数据也会随之改变。创建视图的语法格式如下: CREATE 或者REPLACE VIEW ...
  • Oracle入门到实战

    万次阅读 多人点赞 2019-11-09 11:12:07
    Oracle学习:Oracle基础语句、Oracle表查询关键字、Oracle常用函数、Oracle常用结构
  • 文章目录1 视图概述、创建视图1.1 基本概念1.2 创建视图(1)单表创建视图(2)多表创建视图(3)在视图中创建新视图2 查看视图、修改视图2.1 查看视图2.2 修改视图3 视图数据更新、删除3.1 视图数据更新3.2...
  • 数据库只存放了视图定义,并没有存放视图中的数据,这些数据都存放在定义视图查询所引用的真实表。 ​ 使用视图查询数据时,数据库会从真实表取出对应的数据。因此,视图中的数据是依赖于真实表的数据的...
  • SQL岗位30个面试题,SQL面试问题及答案

    万次阅读 多人点赞 2019-06-19 17:42:34
    SQL岗位30个面试题,SQL面试问题及答案: 什么是SQL? SQL(结构化查询语言)是一种设计用于检索和操作数据的数据库。它属于美国国家标准协会(ANSI)的一种标准,...,指定了列数称为字段,但未定义行数称...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 134,491
精华内容 53,796
关键字:

在视图的定义语句中只能包含