精华内容
下载资源
问答
  • 文章来源:Mysql进阶板斧(一)带你彻底搞懂View视图的原理及应用原文作者:陈哈哈,如有侵权...视图是一虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql...

    ebfce34c57b0257b0e518772c8a2a5ca.png
    文章来源:Mysql进阶三板斧(一)带你彻底搞懂View视图的原理及应用
    原文作者:陈哈哈,如有侵权,请联系删除,谢谢。
    来源平台:CSDN论坛博客

    视图的起源

    • MySQL5.0.1(开天辟地一版本)中增加的三大新功能之一,另外两个师兄弟是存储过程与触发器。均属于相对“高级”一点的数据库必需功能。
    • 视图是一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果
    • MySQL在定义视图上没什么限制,基本上所有的查询都可定义为视图,同时也支持可更新视图(当然只有在视图和行列与基础表的行列之间存在一一对应关系时才能更新),因此从功能上说MySQL的视图功能已经很完善了。

    405b1fc3f77859b714edfeb68a138493.png

    一、视图概述

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

    c9e5e34cbca6f73adfdf4568831e5e14.png

    二、视图的意义

    既然视图的定义是基于基本表的,哪为什么还要定义视图呢?这是因为合理地使用视图能够带来许多好处:

    1、 视图能简化用户操作
    视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐藏起来了。换句话说,用户所作的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。

    2、 视图使用户能以多种角度看待同一数据
    视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。
    例如,Student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本原系学生视图。

    一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限给不同的用户使用。

    dfa77604325a397b2b562ffa241736a2.png

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

    数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。

    在关系型数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系Student(ID,Sname,sex,age,class),

    分为SX(SID,Sname,age)和SY(SID,sex,class)两个关系。这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:

    CREATE VIEW StudentSIDSnamesexageclassAS SELECT SX.IDSX.SnameSY.sex
    SX.ageSY.class FROM Student1 SXStudent2 SY WHERE SX.SID=SY.SID

    这样尽管数据库的逻辑结构改变了(变为SX和SY两个表了),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。
    当然,视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。4、安全性
    有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应该看到这些数据的用户视图上。这样视图机制就自动提供了对机密数据的安全保护功能。

    6.灵活性

    复杂的查询需求。可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。

    视图的工作机制:当调用视图的时候,才会执行视图中的sql,进行取数据操作。视图的内容没有存储,而是在视图被引用的时候才派生出数据。这样不会占用空间,由于是即时引用,视图的内容总是与真实表的内容是一致的。

    视图这样设计有什么好处?节省空间,内容是总是一致的话,那么我们不需要维护视图的内容,维护好真实表的内容,就可以保证视图的完整性了。

    2998615d86ac0ff025355bdd65063c65.png

    三、实际应用

    #数据准备

    想我初三时常年倒数,成绩稳定,因此我拿当时排名数据来纪念一波。给大家提供一个测试数据;

    1、学生表

    CREATE TABLE `student` (
    `ID`  int NOT NULL AUTO_INCREMENT  ,
    `SNAME`  varchar(30) NOT NULL ,
    `SEX`  char(2) NOT NULL ,
    `AGE`  int NOT NULL ,
    `CLASS`  varchar(10) NOT NULL ,
    `GRADE`  varchar(20) NOT NULL ,
    `HOBBY`  varchar(100) NULL ,
    PRIMARY KEY (`ID`)
    )

    #插入数据:

    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('1', '陈哈哈', '男', '15', '18班', '9年级', '上网');
    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('2', '扈亚鹏', '男', '15', '18班', '9年级', '美食');
    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('3', '刘晓莉', '女', '14', '18班', '9年级', '金希澈');
    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('4', '朱志鹏', '男', '15', '18班', '9年级', '睡觉');
    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('5', '徐立楠', '女', '14', '18班', '9年级', '阅读');
    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('6', '顾昊', '男', '15', '5班', '9年级', '篮球');

    #插入的结果:

    dd1508df7fee62e08562ca9a94dfbad5.png

    2、再定义一张学生排名表:

    create TABLE student_score(
    SID INT PRIMARY KEY,
    TOTAL_SCORE INT NOT NULL,
    RANK INT NOT NULL,
    CONSTRAINT `FK_ID` FOREIGN KEY(SID) REFERENCES student(ID)
    )

    #插入如下:

    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('1', '405', '1760');
    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('2', '497', '1000');
    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('3', '488', '1170');
    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('4', '405', '1770');
    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('5', '530', '701');
    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('6', '485', '1286');

    #内容:

    6fc98779f4da43e0f5e3bea539592a72.png

    #使用案例


    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是一个查询语句,这个查询语句可从表或其它的视图中查 询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。
    表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复。

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

    SELECT SELECT_priv,create_view_priv from mysql.user WHERE user='root'

    #Y表示有创建的权限

    4ae193cffad343607b40a9c83840ec0e.png

    2、单表上创建视图

    #在员工表是创建视图

    CREATE VIEW S_VIEW1(ID, SNAME, SEX, AGE,CLASS,GRADE,HOBBY) AS SELECT ID, SNAME, SEX,
    AGE,CLASS,GRADE,HOBBY FROM student;

    #然后是显示内容:

    SELECT * FROM S_VIEW1

    cd51bce7910996e37940843967a53a2a.png

    3、多表上创建视图

    CREATE VIEW V_VIEW2(ID, SNAME, SEX, AGE, CLASS, GRADE, HOBBY, TOTAL_SCORE, RANK) 
    AS SELECT a.ID, a.SNAME, a.SEX, a.AGE,a.CLASS, a.GRADE, a.HOBBY, b.TOTAL_SCORE, b.RANK
    FROM student a,student_score b WHERE a.ID=b.SID;

    #然后是显示内容

    SELECT * FROM V_VIEW2

    7becc75deda466a860b5ec87bc86bdf5.png

    4、查看视图详情

    (1)DESCRIBE :查询视图结构

    DESCRIBE V_VIEW2

    c8dce5595cdb47c46a9f9e983dcc5a92.png

    (2)SHOW TABLE STATUS : 查询视图状态

    show TABLE status LIKE 'V_VIEW2'

    92b5567248656fc3645eb6f1cae7644a.png

    (3)SHOW CREATE view :

    show CREATE view V_VIEW2

    d3e4d772492c9d33fa05cdd0efd82408.png

    5、修改视图SQL

    (1)CREATE OR REPLACE 命令

    CREATE OR REPLACE VIEW S_VIEW1(ID, SNAME, SEX) AS SELECT ID, SNAME, SEX  
    FROM student;

    9f4254d3a336db681b5bb3a77194b130.png

    (2) ALTER 命令

    ALTER VIEW S_VIEW1(ID, SNAME) AS SELECT ID, SNAME FROM student;

    #查询该视图

    SELECT * FROM S_VIEW1

    f02f321fd263ab7a1e8087058e6489c6.png

    6、更新视图数据

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

    比如,我想把我的分数改高一些。更新前如下:

    d118cfbaececca86d6809ab85af20555.png

    #COOL!!把我的总分改成1000分了!!更新后发现忘了改名字。。还是并列倒数第一 -_-''|(更新语句如下):

    UPDATE V_VIEW2 SET TOTAL_SCORE=1000 WHERE SNAME='陈哈哈'

    fd84460169f9c42bf16fb0fe55ca1005.png

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

    SELECT * FROM student_score

    06a264e6382de90bb31393a925e8540d.png

    #不可更新的视图:
    某些视图是可更新的。也就是说,可以在诸如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条件的视图不起作用的

    CREATE VIEW S_VIEW3(ID, SNAME, SEX, AGE, CLASS, GRADE, HOBBY) AS SELECT 
    ID, SNAME, SEX, AGE, CLASS, GRADE, HOBBY FROM student 
    WHERE CLASS='18班' WITH LOCAL CHECK OPTION;

    #表示只限定插入班级为18班的人。

    22943c998038acdf8fe15236c2737727.png

    #然后插入一条:

    注:向视图中插入数据时无法触发基本表的自动递增属性,所以ID不能直接写null,否则报错([Err] 1048 - Column 'ID' cannot be null)

    INSERT INTO S_VIEW3(ID, SNAME, SEX, AGE, CLASS, GRADE, HOBBY) 
    VALUES('7','陈子凝','',15,'18班','9年级','看电影');

    #看下结果:

    SELECT * FROM S_VIEW3

    6e31dabdaf88ffe93b1142bf92746b82.png

    #再来插入一条其他班级的数据:

    INSERT INTO S_VIEW3(ID, SNAME, SEX, AGE, CLASS, GRADE, HOBBY) 
    VALUES('7','吴迪','',15,'20班','9年级','吹牛逼');

    fb2c418e41b0961b4be72523dac4695c.png

    结果显示插入失败
    对于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、删除视图

    DROP VIEW IF EXISTS '视图名'
    展开全文
  • 视图是一虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果 MySQL在定义视图上没什么限制,基本上所有的查询都可定义为视图,同时也...

    视图的起源

    • MySQL5.0.1(开天辟地一版本)中增加的三大新功能之一,另外两个师兄弟是存储过程与触发器。均属于相对“高级”一点的数据库必需功能。
    • 视图是一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果
    • MySQL在定义视图上没什么限制,基本上所有的查询都可定义为视图,同时也支持可更新视图(当然只有在视图和行列与基础表的行列之间存在一一对应关系时才能更新),因此从功能上说MySQL的视图功能已经很完善了。

    小伙伴想精准查找自己想看的MySQL文章?喏  MySQL专栏目录 | 点击这里

    一、视图概述

     

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

    二、视图的意义

    既然视图的定义是基于基本表的,哪为什么还要定义视图呢?这是因为合理地使用视图能够带来许多好处:


    1、 视图能简化用户操作
           视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐藏起来了。换句话说,用户所作的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。


    2、 视图使用户能以多种角度看待同一数据
           视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。
           例如,Student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本原系学生视图。

          一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限给不同的用户使用。

    3、 视图对重构数据库提供了一定程度的逻辑独立性
          数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。
    在关系型数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系Student(ID,Sname,sex,age,class),
    分为SX(SID,Sname,age)和SY(SID,sex,class)两个关系。这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:

    CREATE VIEW Student(SID,Sname,sex,age,class)AS SELECT SX.ID,SX.Sname,SY.sex,
    SX.age,SY.class FROM Student1 SX,Student2 SY WHERE SX.SID=SY.SID;


         这样尽管数据库的逻辑结构改变了(变为SX和SY两个表了),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。
    当然,视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。

    4、安全性
           有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应该看到这些数据的用户视图上。这样视图机制就自动提供了对机密数据的安全保护功能。

     

    6.灵活性

           复杂的查询需求。可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。

           视图的工作机制:当调用视图的时候,才会执行视图中的sql,进行取数据操作。视图的内容没有存储,而是在视图被引用的时候才派生出数据。这样不会占用空间,由于是即时引用,视图的内容总是与真实表的内容是一致的。

           视图这样设计有什么好处?节省空间,内容是总是一致的话,那么我们不需要维护视图的内容,维护好真实表的内容,就可以保证视图的完整性了。

    三、实际应用

     

    #数据准备

    想我初三时常年倒数,成绩稳定,因此我拿当时排名数据来纪念一波。给大家提供一个测试数据;

    1、学生表

    CREATE TABLE `student` (
    `ID`  int NOT NULL AUTO_INCREMENT  ,
    `SNAME`  varchar(30) NOT NULL ,
    `SEX`  char(2) NOT NULL ,
    `AGE`  int NOT NULL ,
    `CLASS`  varchar(10) NOT NULL ,
    `GRADE`  varchar(20) NOT NULL ,
    `HOBBY`  varchar(100) NULL ,
    PRIMARY KEY (`ID`)
    )

    #插入数据:

    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('1', '陈哈哈', '男', '15', '18班', '9年级', '上网');
    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('2', '扈亚鹏', '男', '15', '18班', '9年级', '美食');
    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('3', '刘晓莉', '女', '14', '18班', '9年级', '金希澈');
    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('4', '朱志鹏', '男', '15', '18班', '9年级', '睡觉');
    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('5', '徐立楠', '女', '14', '18班', '9年级', '阅读');
    INSERT INTO `student` (`ID`, `SNAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) VALUES ('6', '顾昊', '男', '15', '5班', '9年级', '篮球');


    #插入的结果:

    2、再定义一张学生排名表:

    create TABLE student_score(
    SID INT PRIMARY KEY,
    TOTAL_SCORE INT NOT NULL,
    RANK INT NOT NULL,
    CONSTRAINT `FK_ID` FOREIGN KEY(SID) REFERENCES student(ID)
    )

    #插入如下:

    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('1', '405', '1760');
    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('2', '497', '1000');
    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('3', '488', '1170');
    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('4', '405', '1770');
    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('5', '530', '701');
    INSERT INTO `student_score` (`SID`, `TOTAL_SCORE`, `RANK`) VALUES ('6', '485', '1286');


    #内容:

    #使用案例


    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是一个查询语句,这个查询语句可从表或其它的视图中查 询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。
    表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复。

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

    SELECT SELECT_priv,create_view_priv from mysql.user WHERE user='root'

    # Y表示有创建的权限


    2、单表上创建视图

    #在员工表是创建视图

    CREATE VIEW S_VIEW1(ID, SNAME, SEX, AGE,CLASS,GRADE,HOBBY) AS SELECT ID, SNAME, SEX,
    AGE,CLASS,GRADE,HOBBY FROM student;

    #然后是显示内容:

    SELECT * FROM S_VIEW1


    3、多表上创建视图

    CREATE VIEW V_VIEW2(ID, SNAME, SEX, AGE, CLASS, GRADE, HOBBY, TOTAL_SCORE, RANK) 
    AS SELECT a.ID, a.SNAME, a.SEX, a.AGE,a.CLASS, a.GRADE, a.HOBBY, b.TOTAL_SCORE, b.RANK
    FROM student a,student_score b WHERE a.ID=b.SID;

    #然后是显示内容

    SELECT * FROM V_VIEW2


    4、查看视图详情

    (1)DESCRIBE :查询视图结构

    DESCRIBE V_VIEW2


    (2)SHOW TABLE STATUS : 查询视图状态

    show TABLE status LIKE 'V_VIEW2'


    (3)SHOW CREATE view :

    show CREATE view V_VIEW2


    5、修改视图SQL

    (1)CREATE OR REPLACE 命令

    CREATE OR REPLACE VIEW S_VIEW1(ID, SNAME, SEX) AS SELECT ID, SNAME, SEX  
    FROM student;


    (2) ALTER 命令

    ALTER VIEW S_VIEW1(ID, SNAME) AS SELECT ID, SNAME FROM student;

    #查询该视图

    SELECT * FROM S_VIEW1

    6、更新视图数据

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

    比如,我想把我的分数改高一些。更新前如下:

    #COOL!!把我的总分改成1000分了!!更新后发现忘了改名字。。还是并列倒数第一  -_-''|(更新语句如下):

    UPDATE V_VIEW2 SET TOTAL_SCORE=1000 WHERE SNAME='陈哈哈'

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

    SELECT * FROM student_score

    #不可更新的视图:
    某些视图是可更新的。也就是说,可以在诸如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条件的视图不起作用的

    CREATE VIEW S_VIEW3(ID, SNAME, SEX, AGE, CLASS, GRADE, HOBBY) AS SELECT 
    ID, SNAME, SEX, AGE, CLASS, GRADE, HOBBY FROM student 
    WHERE CLASS='18班' WITH LOCAL CHECK OPTION;


    #表示只限定插入班级为18班的人。


    #然后插入一条:

    注:向视图中插入数据时无法触发基本表的自动递增属性,所以ID不能直接写null,否则报错([Err] 1048 - Column 'ID' cannot be null

    INSERT INTO S_VIEW3(ID, SNAME, SEX, AGE, CLASS, GRADE, HOBBY) 
    VALUES('7','陈子凝','女',15,'18班','9年级','看电影');


    #看下结果:

    SELECT * FROM S_VIEW3

    #同时看真实表中的数据,已经成功插入:

    #再来插入一条其他班级的数据:

    INSERT INTO S_VIEW3(ID, SNAME, SEX, AGE, CLASS, GRADE, HOBBY) 
    VALUES('7','吴迪','男',15,'20班','9年级','吹牛逼');

    结果显示插入失败
    对于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、删除视图

    DROP VIEW IF EXISTS '视图名'


     

    展开全文
  • 1、RowNum RowNum实际上是一个列名,属于一个伪劣,即不需要...集合包括三种:并集、交集、差集 Union----并集,将两个集合中记录合并,但消除相同记录; Union all --- 也是并集, 不消除相同记录 Intersec

    1、RowNum

    RowNum实际上是一个列名,属于一个伪劣,即不需要用户自定义的列,用于表示每条记录的行号,从第一行开始

           如果需要查询某些特定的行号集合,可以通过子查询配合查询


    2、集合

    集合包括三种:并集、交集、差集

    Union----并集,将两个集合中的记录合并,但消除相同的记录;

    Union all --- 也是并集, 不消除相同的记录

    Intersect ----交集,将两个集合中相同记录集返回

    Minus------差集,将讲个集合中互不重复的记录返回


    3、视图

    Create view vname as 子查询

    视图实际上就是一个复杂的子查询构成的,也可以当成一张表使用,视图只能用来查询,不能修改记录,查询与查询表一样


    4、序列

    Oracle中如果想存在一个自动增长的列,则需要借助序列来完成

    创建序列

    Create sequence sname

    [increment by n] [start with r]

    每个序列都包括两个值,一个是nextval(下个值),一个是currval(当前值)

    展开全文
  • 表名或视图列表:表示即将进行数据查询的数据表或者视图,表或视图可以有多个。 条件表达式1:设置查询的条件。 属性名1:表示按该字段中的数据进行分组。 条件表达式2:表示满足该表达式的数据才能输出。 属性2:...
  • 【简答题】【单选题】根据皮亚杰的认知发展理论,13岁幼儿处于( )阶段【单选题】有关护理程序错误的是【判断题】建立索引的目的是为了加快查询速度。【单选题】AT89C51单片机电源电压是多少?【判断题】视图是一...

    【填空题】用在子查询前,用于判断子查询结果不为空集的特殊判断词是___。

    【单选题】下列哪项不属于单片机最小系统组织部分?

    【简答题】

    【单选题】根据皮亚杰的认知发展理论,13岁幼儿处于( )阶段

    【单选题】有关护理程序错误的是

    【判断题】建立索引的目的是为了加快查询速度。

    【单选题】AT89C51单片机电源电压是多少?

    【判断题】视图是一种数据库安全机制。

    【单选题】阅读课文p100第三自然段,完成下列各题。 1.对选文内容,概括正确的一项是( )

    【单选题】患者男, 40岁。汉族,教师。以“心慌、气短、疲乏”为主诉入院。护士入院评估:P120次/分,BP70/46mmHg,脉搏细弱,口唇发绀,呼吸急促,患者自制力差、便秘。此外还收集了患者的既往病史、家庭关系、排泄等资料。 以下属于患者主观资料的是

    【简答题】The research contents of Chemistry science?

    【单选题】马斯洛将人的基本需要分为五个层次,由低到高依次为

    【单选题】阅读课文第3自然段及第13和14自然段,完成下列各题。 画线处 陶然亭的芦花,钓鱼台的柳影,西山的虫唱,玉泉的夜月,潭柘寺的钟声 的几个景物是作者一直萦绕心头的,课文中为何不详写?( )

    【单选题】以下可以促进有效沟通进行的行为是

    【判断题】MySQL中数据类型varchar(50)和char(50)是完全相同的。

    【单选题】护士收集健康资料的目的中,错误的是

    【判断题】MySQL语句在书写时不区分大小写。

    【填空题】INNER JOIN代表___连接;LEFT OUTER JION代表___连接。

    【单选题】( )年,冯特在德国莱比锡大学建立了第一个心理学实验室,标志着科学心理学的诞生

    【单选题】以下描述中,对空值不正确的描述是( )。

    【简答题】传统密码

    【单选题】这一选段文字中,“ 不逢北国之秋,已将近十余年了。在南方每年到了秋天,总要想起 陶然亭的芦花,钓鱼台的柳影,西山的虫唱,玉泉的夜月,潭柘寺的钟声 。在北平即使不出门去罢,就是在皇城人海之中,租人家一椽破屋来住着,早晨起来,泡一碗浓茶、向院子一坐,你也能看得到很高很高的碧绿的天色,听得到青天下驯鸽的飞声。从槐树叶底,朝东细数着一丝一丝漏下来的日光,或在破壁腰中,静对着象喇叭似的牵牛花(朝荣)的蓝朵,自然而然地也能够感觉到十分的秋意。说到了牵牛花,我以为以蓝色或白色者为佳,紫黑色次之,淡红色最下。最好,还要在牵牛花底,教长着几根疏疏落落的尖细且长的秋草,使作陪衬。” 作者紧扣住哪两个字落笔? ( )

    【单选题】在护理程序中,指导护理活动的思想核心是

    【单选题】下列各项中未使用 以情驭景、以景显情手法的一项是( )

    【单选题】有关选段(第三自然段)景物描写的作用,分析有误的一项是( )

    【单选题】选文中,两次写到声音:一是“青天下驯鸽的飞声”,一是“秋蝉的衰弱的残声”。对这样写的作用分析正确的一项是( )

    【单选题】下列哪项内容不能体现作者“感觉到的秋意”? ( )

    【填空题】视图是一个___表。

    【判断题】设置惟一约束的列允许有多个空值。

    【单选题】用于计算score字段累加和的聚合函数是( )。

    【简答题】PkI的5道选择题答案

    【单选题】对“说到了牵牛花,我以为蓝色或白色者为佳,紫黑色次之,淡红者最下”一句,分析不当的一项是( )

    【其它】

    【单选题】阅读故都的秋第三、四和五片段段,完成下列各题。 选出对画线文字 1 像花而又不是花的那一种落蕊。早晨起来,会铺得满地。脚踏上去,声音也没有,气味也没有,只能感出一点点极微细极柔软的触觉。 画线文字分析理解最正确的一项( )。

    【单选题】慢性肺心病患者的心理社会状况评估内容不包括

    【单选题】假定已创建视图namelist,查询namelist的全部数据的语句是( )。

    【单选题】护士采集某消化性溃疡病人资料,属于一般资料的是

    【单选题】对三节文字分析理解正确的一项是( )

    【简答题】

    【判断题】视图本身并不存储数据,因为视图是一个虚拟表。

    【单选题】在CREATE TABLE语句中,通常使用( ) 关键字来指定主键。

    【单选题】护士收集某心绞痛病人资料时,属于客观资料的是

    【判断题】char、varchar数据类型值在使用时可以要用单引号或双引号括起来。

    【判断题】一张表允许有多个主键,但只能有一个外键。

    【单选题】下列哪项构成了护理程序的理论框架

    【单选题】收集资料的目的不包括

    【单选题】李先生,自感全身不适前来就诊。门诊护士巡视时发现他面色苍白,出冷汗,呼吸急促,主诉腹痛剧烈。急诊医生处理后,李先生留住急诊观察室。你在评估病人时,下述哪项是客观资料

    【单选题】幼儿主要的活动方式是( )

    【单选题】选出对 2 古人所说的梧桐一叶而天下知秋的遥想,大约也就在这些深沉的地方。 画线文字分析理解最正确的一项( )。

    【简答题】

    展开全文
  • XX软件工程师笔试试题 注:1、请参考人员将答案写在答题纸上,勿将答案写在此卷上。 2、请参考人员将编号与...47、Flex与数据库连接的三种方式? 我的答案: 自己编的 ---------------------------------...
  • 恒等查询条件对查询的影响 284 两层GROUP BY的效率反而比一层GROUP BY高 287 增加DISTINCT后查询效率反而提高 290 增加索引改变执行计划 292 第4篇 性能优化篇 295 执行计划与统计信息案例 297 CBO使用CHECK的...
  • mvcc方便理解版本

    2021-01-31 22:17:02
    一个数据版本,对于一个事务视图来说,除了自己更新总是可见以外,有三种情况:版本未提交,不可见;版本已提交,但是是在视图创建后提交,不可见;版本已提交,而且是在视图创建前提交,可见。 现在,我们用...
  •  本书介绍了java ee规范的三大主要规范jsf、ejb 3和jpa,其中jsf是sun公司提供的jsf ri;ejb 3部分则包含session bean、message driven bean的详细介绍。所使用的应用服务器是jboss 5.1和weblogic 11g,详细介绍了...
  • 3、SQL中属于分组查询的语句是?() 正确答案: C 你的答案: C (正确) Where 联盟链 Group By Having 4、SQL语言共分为大类(亦有说法分为四大类),那么不属于数据操纵语言的有() 正确答案: B 你的答案: B (正
  • Oracle 数据字典

    2017-10-16 15:42:31
    数据字典表和普通表区别数据字典表里数据是Oracle系统 ...为了方便区别这些表,这些表名字都是用”$”结尾,这些表属于SYS用户 三种前缀数据字典视图  user_ :任何用户都可以读取的视图,每个用户读取
  • 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...
  • 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...
  • 物理结构包含三种数据文件: 1) 控制文件 2) 数据文件 3) 在线重做日志文件  逻辑结构 功能:数据库如何使用物理空间 组成:表空间、段、区、块组成层次 六、 oracle安装、卸载和启动  硬件要求 物理内存:...
  • 下列图符名标识的图符不属于数据流图合法图符的是______。(A) A. 控制流 B. 加工 C. 数据存储 D. 源和潭 (17) 软件需求分析阶段的工作,可以分为四个方面:需求获取、需求分析、编写需求规格说明书以及______。(B) A...
  • (50) 数据库概念设计的过程中,视图设计一般有三种设计次序,以下各项中不对的是(D) 注:P127,要牢记 A. 自顶向下 B. 由底向上 C. 由内向外 D. 由整体到局部 (51) 在计算机中,算法是指(C) A. 查询方法 B. 加工方法...
  •  诚然,这个数据的确显示数据库的内存命中率低得可怜,但是我想告诉你的是,这是一个在线分析(OLAP)系统的数据库,运行着很多非常大的查询,每个查询搜索的范围都在上亿条记录以上,那这个结果不是很正常吗?...
  • Spring面试题

    2015-05-06 07:19:39
    5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象 6.视图对象负责渲染返回给客户端。 为什么用: {AOP 让开发人员可以创建非行为性关注点,称为横切关注点,并将它们插入...
  • oracle数据库经典题目

    2011-02-17 15:05:20
    3. 如果要查询数据库中所有表信息,应当使用下列哪数据字典视图?( A ) A. DBA视图 B. ALL视图 C. USER视图 D. 动态性能视图 4. 下列哪一项是Oracle数据库中最小存储分配单元? ( C ) A. 表空间 B. 段 C. 盘区...
  • 13.1.3 EXISTS 及其相关子查询的使用 213 13.2 外部连接 214 13.2.1 Oracle 9i以前版本中的外部连接的语法 215 13.2.2 现在的外部连接语法 216 13.2.3 用外部连接代替NOT IN 218 13.2.4 用NOT EXISTS 代替NOT ...
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
    6.13 秘诀:视图的淡入和淡出 185 6.14 秘诀:视图交换 186 6.15 秘诀:翻转视图 187 6.16 秘诀:使用Core Animation Transitions 188 6.17 秘诀:一般的Core Animation调用 190 6.18 翻页过渡 192 6.19 秘诀...
  • 在先左后右原则下,根据访问根结点次序,二叉树遍历分为类:前序遍历、中序遍历和后序遍历。 (1)前序遍历 先访问根结点,然后遍历左子树,最后遍历右子树;并且在遍历左、右子树时,仍需先访问根结点,...
  • 8.1 虚拟数据表:视图的应用 实例259 查询视图中的员工工资数据 实例260 获取当前数据库中的全部用户视图 实例261 修改视图中的数据 8.2 高效的数据处理:存储过程的应用 实例262 存储过程的简单应用 实例263...
  • LuceneInAction(第2版)_中文版

    千次下载 热门讨论 2012-07-12 09:52:59
    5.5.1 跨度查询的构建模块:SpanTermQuery 165 5.5.2 在域的起点查找跨度 166 5.5.3 彼此相邻的跨度 167 5.5.4 在匹配结果中排除重叠的跨度 169 5.5.5 SpanOrQuery类 170 5.5.6 SpanQuery类和QueryParser类 ...
  • 下列属于面向对象开发方法的是(A B C D)。 A) Booch B) UML C) Coad D) OMT 6. 软件危机的主要表现是(B D)。 A) 软件成本太高 B) 软件产品的质量低劣 C) 软件开发人员明显不足 D) 软件生产率低下 7...
  • 4.2.1 反射的原理,反射创建类实例的三种方式是什么。 4.2.2 反射中,Class.forName和ClassLoader区别 。 4.2.3 描述动态代理的几种实现方式,分别说出相应的优缺点。 4.2.4 动态代理与cglib实现的区别。 4.2.5 ...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
  • 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

空空如也

空空如也

1 2 3
收藏数 55
精华内容 22
关键字:

属于查询的三种视图的是