• MySQL——视图


    核心知识点:

    1.视图定义

    2.视图的好处:安全、节约资源、操作简单,数据的同一性

    3.视图的基本操作

    一、视图概论

    视图是一个虚拟表,其内容由查询定义。

    同真实的表一样,视图包含一系列带有名称的列和行数据。

    但是,视图并不在数据库中以存储的数据值集形式存在。

    行和列数据来自由定义视图的查询所引起的表,并且在引用视图时动态生成

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

    定义视图的筛选可以来自当前或其他数据库的一个或者多个表,或者其他视图。

    通过视图查询没有任何限制,通过它们进行数据修改时的限制也很少。

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

    第一,安全原因,视图可也隐藏一些数据,例如:社会保险基金表,可以用视图只显示姓名,而不显示社会保险号和工资数等。

    第二,可使复杂的查询易于理解和使用,这个视图就像一个“窗口”,从中只能看到你想看到的数据列。

      这意味着你可以在这个视图上使用select *,而你看到的是你在视图定义里给出的那些数据列。

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

    1.视图能简化用户操作。

    视图机制使用户可以将注意力集中在所关心地数据上。

    如果这些数据不是直接来自基本表,则可以通过定义视图,是数据库看起来结构简单、清晰,并且可以简化用户地数据查询操作。

    例如,那些定义了若干张表连接地视图,就将表与表之间的连接操作对用户隐藏起来。

    换句话说,用户所做的只是对一张虚拟的简单查询,而这个虚表是怎样得来的,用户无需了解。

    2.视图使用户能以多种角度看待同一数据

    视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。

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

    数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。

    数据库的逻辑独立性是指当数据库重构时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。

    层次数据库和网状数据库一般能较好地支持数据地物理独立性,而对于逻辑独立性则不能完全地支持。

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

    有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应该看到这些数据的用户视图上。

    这样视图机制就自动提供了对机密数据的安全保护功能。

    5.节约系统资源

    视图类似于映射,它是一张虚拟表,并不是真实的存在磁盘上,而是由视图命令动态生成的,这样可以可能的减少冗余。

    二、实例解释

    现在我有一张学生信息的表,里面有学生的基本信息以及学生的账号和密码,但是这张表我不想直接展示出来,因为这样不安全。

    需求1:我只想展示学生的基本信息,同时学生能更改展示的信息,默认只能更改自己的信息。

    #学生信息表,但是不能公开
    mysql> select * from student_info; +----+--------+---------+--------------+------------+-----------+ | id | name | dorm | addr | account | passwd | +----+--------+---------+--------------+------------+-----------+ | 1 | 科比 | 6号楼 | 湖北罗田 | 1041031711 | dfghjkldf | | 2 | 毛线 | 6号楼 | 湖北孝感 | 1041031715 | tyujkljk | | 3 | 黄鱼 | 5号楼 | 湖北罗田 | 1041031732 | 5uy9g6 | | 4 | 子豪 | 6号楼 | 江苏扬州 | 1041031721 | rtyui | | 5 | 星爷 | 5号楼 | 湖北孝感 | 1041031743 | tghj8g | | 6 | 代鹏 | 5号楼 | 江苏盐城 | 1041031701 | gvhui745 | | 7 | 子栋 | 6号楼 | 湖北洪湖 | 1041031723 | 568g29 | | 8 | 周攀 | 6号楼 | 湖北武穴 | 1041031719 | 976uyif | | 9 | 大爷 | 5号楼 | 湖北通城 | 1041031710 | cvbdf | | 10 | 小鸟 | 6号楼 | 湖北襄阳 | 1041031737 | 456dfg | +----+--------+---------+--------------+------------+-----------+ 10 rows in set (0.00 sec)

    我们创建一个视图,不包含自己的账号密码

    #创建视图
    mysql> create view student_info_view as select id,name,dorm,addr from student_info;
    Query OK, 0 rows affected (0.00 sec)
    
    #只展示这张表,这张表并不存在,从主表映射
    mysql> select * from student_info_view;
    +----+--------+---------+--------------+
    | id | name   | dorm    | addr         |
    +----+--------+---------+--------------+
    |  1 | 科比   | 6号楼   | 湖北罗田     |
    |  2 | 毛线   | 6号楼   | 湖北孝感     |
    |  3 | 黄鱼   | 5号楼   | 湖北罗田     |
    |  4 | 子豪   | 6号楼   | 江苏扬州     |
    |  5 | 星爷   | 5号楼   | 湖北孝感     |
    |  6 | 代鹏   | 5号楼   | 江苏盐城     |
    |  7 | 子栋   | 6号楼   | 湖北洪湖     |
    |  8 | 周攀   | 6号楼   | 湖北武穴     |
    |  9 | 大爷   | 5号楼   | 湖北通城     |
    | 10 | 小鸟   | 6号楼   | 湖北襄阳     |
    +----+--------+---------+--------------+
    10 rows in set (0.00 sec)

    我们只展示外面的这张表,这样就安全了好多,同时不用创建另一张信息表,这样也节约资源。

    我们还可以删除和更改视图,能够同步到原表

    mysql> delete from student_info_view where id = 1;  #删除第一条记录
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from student_info;   #原表也删除了记录
    +----+--------+---------+--------------+------------+----------+
    | id | name   | dorm    | addr         | account    | passwd   |
    +----+--------+---------+--------------+------------+----------+
    |  2 | 毛线   | 6号楼   | 湖北孝感     | 1041031715 | tyujkljk |
    |  3 | 黄鱼   | 5号楼   | 湖北罗田     | 1041031732 | 5uy9g6   |
    |  4 | 子豪   | 6号楼   | 江苏扬州     | 1041031721 | rtyui    |
    |  5 | 星爷   | 5号楼   | 湖北孝感     | 1041031743 | tghj8g   |
    |  6 | 代鹏   | 5号楼   | 江苏盐城     | 1041031701 | gvhui745 |
    |  7 | 子栋   | 6号楼   | 湖北洪湖     | 1041031723 | 568g29   |
    |  8 | 周攀   | 6号楼   | 湖北武穴     | 1041031719 | 976uyif  |
    |  9 | 大爷   | 5号楼   | 湖北通城     | 1041031710 | cvbdf    |
    | 10 | 小鸟   | 6号楼   | 湖北襄阳     | 1041031737 | 456dfg   |
    +----+--------+---------+--------------+------------+----------+
    9 rows in set (0.00 sec)
    
    mysql> select * from student_info_view;  #查看视图
    +----+--------+---------+--------------+
    | id | name   | dorm    | addr         |
    +----+--------+---------+--------------+
    |  2 | 毛线   | 6号楼   | 湖北孝感     |
    |  3 | 黄鱼   | 5号楼   | 湖北罗田     |
    |  4 | 子豪   | 6号楼   | 江苏扬州     |
    |  5 | 星爷   | 5号楼   | 湖北孝感     |
    |  6 | 代鹏   | 5号楼   | 江苏盐城     |
    |  7 | 子栋   | 6号楼   | 湖北洪湖     |
    |  8 | 周攀   | 6号楼   | 湖北武穴     |
    |  9 | 大爷   | 5号楼   | 湖北通城     |
    | 10 | 小鸟   | 6号楼   | 湖北襄阳     |
    +----+--------+---------+--------------+
    9 rows in set (0.00 sec)

    更新也是一样。

    需求2:现在有一张学生成绩表,学生可以看到学号信息,需要联合查询

    #学生成绩表,缺学号
    mysql> select * from student_score;
    +----+--------+-------+-------+--------+
    | id | name   | linux | mysql | python |
    +----+--------+-------+-------+--------+
    |  1 | 科比   |    63 |    33 |     76 |
    |  2 | 毛线   |    45 |    67 |     56 |
    |  3 | 黄鱼   |    89 |    34 |     67 |
    |  4 | 子豪   |    56 |    78 |     56 |
    |  5 | 星爷   |    56 |    90 |     78 |
    |  6 | 代鹏   |    89 |    96 |     87 |
    |  7 | 子栋   |    67 |    76 |     45 |
    |  8 | 周攀   |    34 |    56 |     45 |
    |  9 | 大爷   |    56 |    54 |     60 |
    | 10 | 小鸟   |    78 |    75 |     67 |
    +----+--------+-------+-------+--------+
    10 rows in set (0.00 sec)

    我们再创建一张视图

    #创建视图,后面使用联合查询,可以来自不同的库
    mysql> create view student_score_view as select a.id,a.name,b.account,a.linux from student_score a,student_info b where a.name = b.name;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> select * from student_score_view;
    +----+--------+------------+-------+
    | id | name   | account    | linux |
    +----+--------+------------+-------+
    |  1 | 科比   | 1041031711 |    63 |
    |  2 | 毛线   | 1041031715 |    45 |
    |  3 | 黄鱼   | 1041031732 |    89 |
    |  4 | 子豪   | 1041031721 |    56 |
    |  5 | 星爷   | 1041031743 |    56 |
    |  6 | 代鹏   | 1041031701 |    89 |
    |  7 | 子栋   | 1041031723 |    67 |
    |  8 | 周攀   | 1041031719 |    34 |
    |  9 | 大爷   | 1041031710 |    56 |
    | 10 | 小鸟   | 1041031737 |    78 |
    +----+--------+------------+-------+
    10 rows in set (0.00 sec)

    如果要查看账号的同时,并且看分数,那就要联合查,SQL语句非常繁琐,而使用视图就可以简化操作过程

    总结:视图的基本操作

    创建视图:

    CREATE VIEW 视图名 as SQL查询;

    使用视图:

    SELECT * FROM 视图名;

    更新视图记录:

    UPDATE 视图名 SET  字段名= xxx WHERE XXXX;

    删除视图记录:

    DELETE FROM 视图名 WHERE xxxx;

    删除视图:

    drop view 视图名;

  • 相关阅读:
    507.Perfect Number
    441.Arranging Coins
    344.Reverse String
    160.Intersection of Two Linked Lists
    HDU-2521 反素数
    HDU-2710 Max Factor
    HDU-2552 三足鼎立
    HDU-2549 壮志难酬
    HDU-2548 两军交锋
    HDU-2550 百步穿杨
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/8028866.html
Copyright © 2020-2023  润新知