zoukankan      html  css  js  c++  java
  • Mysql-视图

    1.什么是视图?

      视图是由数据库中的一个表或多个表导出的虚拟表。其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而没有存放视图中的数据。这些数据还是存在原来的表中,使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此视图中的数据是依赖于原来的表中的数据。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。

      视图是存储在数据库中的查询的SQL语句,它主要出于两种原因:

      1.1 安全原因:视图可以隐藏一些数据

      1.2 可以使复杂的查询易于理解和使用。

    2.视图的作用

      对视图中所引用的基础表来说,视图的作用类似于筛选。

      2.1 简单性:看到的就是需要的

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

      2.2 安全性

          视图的安全性可以防止未授权用户查看特定的行或列,使有权限用户只能看到表中特定行的方法

          1.在表中增加一个标志用户名的列

          2.建立视图,使用户只能看到标有自己用户名的列

          3.把视图授权给其他用户

        2.3 逻辑数据独立性

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

        1.如果应用建立在数据表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而使应用程序可以不动。

        2.如果应用建立在数据表上,当应用发生变化时,可以在表上建立视图,通过视图屏蔽应用的变化,从而使应用程序可以不动。

        3.如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而使应用程序可以不动

        4.如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而使数据库可以不动。

      3. 创建视图

      创建视图是在已经存在的数据库表上建立视图,视图可以建立在一张表中,也可以建立在多张表中。

      3.1 查看创建视图的权限

      创建视图需要CREATE VIEW的权限,同时应该具有查询涉及列的权限。可以使用select语句来查询这些权限信息,查询语法如下。

    select Select_priv,Create_view_priv from mysql.user where user=‘root';
    

    3.2 创建视图

      1.在tb_book上建立视图

    CREATE 
    VIEW book_view(a_sort,a_talk,a_books)//视图名(属性清单:可选参数,指定视图中各个属性的名称,默认情况下与select语句中查询的属性相同) AS SELECT sort ,talk,books from tb_book;

      2.在tb_book表和tb_user表上创建名为book_view1的视图

    CREATE  algorithm=merge //视图选择的算法
    VIEW book_view1(a_sort,a_talk,a_books,a_name)
    as select sort,talk,books,tb_user.name from tb_book,tb_name where tb_book.id=tb_name.id 
    with local check option;//表示视图更新时要保证在该视图的权限范围之内。
    

    3.在实际开发过程中的数据表中可能有很多的字段,但某个模块可能只需要其中的几个。为了提高查询的速度和简化操作,可以将该模块需要的字段单独提取出来放在某个视图中。

     例子:有学生表和成绩表,在建立的视图中只含有与学生成绩有关的字段

    CREATE 
    view scoreinfo 
    as select sno.sname,yw,wy,sx from tb_student,tb_score where tb_student.id=tb_score.sid;
    

    创建视图的注意事项:

    1.运行创建视图的语句需要用户具有创建视图的权限,若加了[or replace]时,还需要用户具有删除视图的权限

    2.select语句不能包含from子句中的子查询

    3.select语句不能引用系统或用户变量

    4.select语句不能使用预处理语句参数

    5.在存储子程序内,定义不能引用子程序参数或局部变量。

    6.在定义引用的表或者视图必须存在。但是创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可以使用CHECK TABLE语句。

    7.在定义中不能引用临时表,不能使用临时视图

    8.在视图中定义中允许使用order by,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的语句,它将被忽略。

    4.视图操作

    4.1查看视图

      1.DESCRIBE(简写成DESC)

    DESC bool_view1;
    

       2.show table status

    show table status like 'scoreinfo'//like表示后面匹配的是字符串,视图是要查看的视图名称,需要用单引号定义
    

      3.show create view 

    show create view scoreinfo; 

    4.2 修改视图

    修改视图是修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。

    1.create or replace view

    CREATE OR REPLACE 
    ALGORITHM=TEMPTABLE
    VIEW  book_view(a_sore,a_book)
    as select sort,books from tb_book;
    

    2.alter

    alter view book_view1(a_sort)
    as select sort
    from tb_book
    with check option; 

    4.3 更新视图

    对视图的更新其实就是对表的更新,更新视图是指通过视图来插入,更新,删除表中的数据。因为视图是一个虚拟表,其中没有数据。通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据,超出了范围,就不能更新。

     update scoreinfo set yw="90" where id=2;
    

    1.更新视图的限制

     (1)视图中包含count(),sum(),max(),min()函数

    create
    view bookview(a_sort,a_book)
    as select sort,books ,count(name) from tb_book group by id;
    

      (2) 视图中包含union,union all,distinct,group by 和having等关键字

    create 
    view book_view1(a_sort,a_book)
    as select sort,books from tb_book group by id;
    

     (3)常量视图

    CREATE 
    VIEW book_view 
    as select 'Aric' as a_book;
    

     (4) 视图的select中包含子查询

    CREATE 
    VIEW book_view1(a_sort)
    as select (select name  from tb_book);
    

    (5)由不可更新的视图导出的视图

    CREATE 
    VIEW book_view1
    AS SELECT * FROM book_view2;
    

    (6) 创建视图时,ALGORITHM为TEMPTABLE类型 

    CREATE ALGORITHM=TEMPTABLE
    VIEW book_view1
    as select * from tb_book;

    4.4 删除视图

     删除视图是指删除数据库中已经存在的视图。删除视图时,只能删除视图的定义,不会删除数据。mysql中使用DROP VIEW语句来删除视图。但是用户必须有DROP权限。

    DROP VIEW IF EXISTS bOOK_view1;
    

      

  • 相关阅读:
    OSI安全体系结构
    PHP 二维数组根据相同的值进行合并
    Java实现 LeetCode 17 电话号码的字母组合
    Java实现 LeetCode 16 最接近的三数之和
    Java实现 LeetCode 16 最接近的三数之和
    Java实现 LeetCode 16 最接近的三数之和
    Java实现 LeetCode 15 三数之和
    Java实现 LeetCode 15 三数之和
    Java实现 LeetCode 15 三数之和
    Java实现 LeetCode 14 最长公共前缀
  • 原文地址:https://www.cnblogs.com/cainame/p/11255601.html
Copyright © 2011-2022 走看看