• mysql视图


    视图的定义

    视图是虚拟表或逻辑表,它被定义为具有连接的SQL SELECT查询语句。因为数据库视图与数据库表类似,它由行和列组成,因此可以根据数据库表查询数据。其内容由查询定义。

    但是,视图并不在数据库中以存储的数据值集形式存在,行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。简单的来说视图是由其定义结果组成的表(临时表)


    ## 创建视图 创建视图的语法为 ```sql CREATE VIEW 视图名称 AS SQL语句
    
    <br>
    先创建课程表和学生表
    
    ```sql
    #创建老师表的视图
    mysql> create view teacher_view as select * from teacher;
    Query OK, 0 rows affected (0.39 sec)
    
    #查询视图
    mysql> select * from teacher_view;
    +-----+-----------+
    | tid | tname     |
    +-----+-----------+
    |   1 | 张磊      |
    |   2 | 李平      |
    |   3 | 刘海燕    |
    |   4 | 朱云海    |
    |   5 | 李杰      |
    +-----+-----------+
    rows in set (0.00 sec)
    
    #查询老师表
    mysql> select * from teacher;
    +-----+-----------+
    | tid | tname     |
    +-----+-----------+
    |   1 | 张磊      |
    |   2 | 李平      |
    |   3 | 刘海燕    |
    |   4 | 朱云海    |
    |   5 | 李杰      |
    +-----+-----------+
    rows in set (0.00 sec)
    
    #发现2个表的数据是一摸一样的,没有区别
    
    

    查看数据库文件,发现teacher_view是没有数据文件ibd的


    ## 使用视图
    # 往真实表中插入一条数据,查看一下视图,发现视图表也会跟着更新
    mysql> INSERT INTO teacher (tname) VALUES ('高圆圆');
    Query OK, 1 row affected (0.10 sec)
    
    #查看视图,发现更新了一条数据
    mysql> select * from teacher_view;
    +-----+-----------+
    | tid | tname     |
    +-----+-----------+
    |   1 | 张磊      |
    |   2 | 李平      |
    |   3 | 刘海燕    |
    |   4 | 朱云海    |
    |   5 | 李杰      |
    |   6 | 高圆圆    |
    +-----+-----------+
    rows in set (0.00 sec)
    
    

    #往视图表中插入一条数据,真实表也会发现变化
    mysql> INSERT INTO teacher_view (tname) VALUES ('董卿');
    Query OK, 1 row affected (0.09 sec)
    
    #查看真实表,发现也更新了
    mysql> select * from teacher;
    +-----+-----------+
    | tid | tname     |
    +-----+-----------+
    |   1 | 张磊      |
    |   2 | 李平      |
    |   3 | 刘海燕    |
    |   4 | 朱云海    |
    |   5 | 李杰      |
    |   6 | 高圆圆    |
    |   7 | 董卿      |
    +-----+-----------+
    rows in set (0.00 sec)
    

    如果将连表查询的结果作为视图,那么这个视图是不能修改(插入、删除和更新)数据的
    #创建联合表的视图
    create view ct as select * from course left join teacher on teacher.tid = 
    course.teacher_id;
    
    #查看视图记录
    mysql> select * from ct;
    +-----+--------+------------+------+-----------+
    | cid | cname  | teacher_id | tid  | tname     |
    +-----+--------+------------+------+-----------+
    |   1 | 生物   |          1 |    1 | 张磊      |
    |   2 | 物理   |          2 |    2 | 李平      |
    |   3 | 体育   |          3 |    3 | 刘海燕    |
    |   4 | 美术   |          2 |    2 | 李平      |
    +-----+--------+------------+------+-----------+
    rows in set (0.00 sec)
    
    #插入失败
    mysql> insert into ct values(7,'哈哈',7,7,'张三丰');
    ERROR 1471 (HY000): The target table ct of the INSERT is not insertable-into
    
    

    修改视图

    # 语法:ALTER VIEW 视图名称 AS SQL语句
    mysql> alter view teacher_view as select * from teacher where tid > 3;
    Query OK, 0 rows affected (0.09 sec)
    
    #查看视图记录,发现改变了。
    mysql> select * from teacher_view;
    +-----+-----------+
    | tid | tname     |
    +-----+-----------+
    |   4 | 朱云海    |
    |   5 | 李杰      |
    |   6 | 高圆圆    |
    |   7 | 董卿      |
    +-----+-----------+
    rows in set (0.00 sec)
    
    

    ## 删除视图 删除视图语法为: ```sql DROP VIEW 视图名称
    <br>
    ## 视图的优缺点
    
    ### 视图优点
    <br>
    #### 1. 提高重用性
    如果要频繁获取user的name和goods的name。就应该使用以下sql语言。示例:
    ```sql
    select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;
    

    但有了视图就不一样了,创建视图other。示例

    create view other as select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;
    

    创建好视图后,就可以这样获取user的name和goods的name。示例:

    select * from other;
    

    #### 2. 对数据库重构,却不影响程序的运行

    假如因为某种需求,需要将user拆房表usera和表userb,该两张表的结构如下:
    测试表:usera有id,name,age字段
    测试表:userb有id,name,sex字段
    这时如果后端使用sql语句select * from user;那就会提示该表不存在,这时该如何解决呢。解决方案:创建视图。以下sql语句创建视图:

    create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name;
    

    以上假设name都是唯一的。此时后端使用sql语句select * from user;就不会报错什么的。这就实现了更改数据库结构,不更改脚本程序的功能了。


    #### 3. 提高了安全性能。可以对不同的用户设定不同的视图 例如:某用户只能获取user表的name和age数据,不能获取sex数据。则可以这样创建视图,将用户权限与视图绑定。示例如下: ```sql create view other as select a.name, a.age from user as a; ``` 这样的话,使用sql语句`select * from other;` 最多就只能获取name和age的数据,其他的数据就获取不了了。
    #### 4. 让数据更加清晰 想要什么样的数据,就创建什么样的视图
    ### 缺点 #### 1. 性能差

    从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。


    #### 2. 表依赖关系

    将根据数据库的基础表创建一个视图。每当更改与其相关联的表的结构时,都必须更改视图。

  • 相关阅读:
    各种排序算法的时间复杂度
    svn版本管理系统出现的问题解决办法
    算法时间复杂度
    js处理时间戳显示的问题
    cache缓存的BUG
    使用phpstorm提交svn代码版本管理系统遇到的问题解决办法
    20161101.20161115这两周的开发总结
    mac 上安装 redis
    终极 shell zsh
    在 mac 上利用 homebrew 安装软件
  • 原文地址:https://www.cnblogs.com/zzliu/p/10663218.html
Copyright © 2020-2023  润新知