zoukankan      html  css  js  c++  java
  • 数据库:mysql内置功能-视图

    一 视图

    视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。

    使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用

    #两张有关系的表
    mysql> select * from course;
    +-----+--------+------------+
    | cid | cname  | teacher_id |
    +-----+--------+------------+
    |   1 | 生物 |          1 |
    |   2 | 体育 |          1 |
    |   3 | 物理 |          2 |
    |   4 | 语文 |          3 |
    |   5 | 数学 |          4 |
    |   6 | 英语 |          5 |
    |   7 | 地理 |          2 |
    +-----+--------+------------+
    7 rows in set (0.00 sec)
    
    mysql> select * from teacher;
    +-----+-----------+
    | tid | tname     |
    +-----+-----------+
    |   1 | 张三    |
    |   2 | 李四    |
    |   3 | 王五    |
    |   4 | egon      |
    |   5 | 张无忌 |
    +-----+-----------+
    5 rows in set (0.07 sec)
    
    
    # 查询张三教授的课程名
    mysql> select cname from course where teacher_id =(select tid from teacher where tname='张三');
    +--------+
    | cname  |
    +--------+
    | 生物 |
    | 体育 |
    +--------+
    2 rows in set (0.00 sec)
    
    # 子查询出临时表,作为teacher_id等判断依据
    select tid from teacher where tname='张三'
    

      

    一 创建视图

    # 语法:create view 视图名称 AS sql语句
    mysql> create view teacher_view as select tid from teacher where tname = '张三';
    Query OK, 0 rows affected (0.15 sec)
    
    
    # 于是查询张三教授的课程名的sql可以改写为
    mysql> select cname from course where teacher_id = (select tid from teacher_view);
    +--------+
    | cname  |
    +--------+
    | 生物 |
    | 体育 |
    +--------+
    注意注意注意:
    #1. 使用视图以后就无需每次都重写子查询的sql,但是这么效率并不高,还不如我们写子查询的效率高
    
    #2. 而且有一个致命的问题:视图是存放到数据库里的,如果我们程序中的sql过分依赖于数据库中存放的视图,
    那么意味着,一旦sql需要修改且涉及到视图的部分,则必须去数据库中进行修改,而通常在公司中数据库有专门的DBA负责,
    你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便
    

      

    二 使用视图

    mysql> select * from course;
    +-----+--------+------------+
    | cid | cname | teacher_id |
    +-----+--------+------------+
    | 1 | 生物 | 1 |
    | 2 | 体育 | 1 |
    | 3 | 物理 | 2 |
    | 4 | 语文 | 3 |
    | 5 | 数学 | 4 |
    | 6 | 英语 | 5 |
    | 7 | 地理 | 2 |
    +-----+--------+------------+

    mysql> create view course_view  as select * from course;  
    Query OK, 0 rows affected (0.05 sec)
    
    mysql> select * from course_view;
    +-----+--------+------------+
    | cid | cname  | teacher_id |
    +-----+--------+------------+
    |   1 | 生物 |          1 |
    |   2 | 体育 |          1 |
    |   3 | 物理 |          2 |
    |   4 | 语文 |          3 |
    |   5 | 数学 |          4 |
    |   6 | 英语 |          5 |
    |   7 | 地理 |          2 |
    +-----+--------+------------+
    7 rows in set (0.00 sec)
    
    mysql> update course_view set cname = '化学' where cname = '生物';
    Query OK, 1 row affected (0.08 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> insert into course_view values(8,'历史',3);  # 往视图里面插入数据
    Query OK, 1 row affected (0.02 sec)
    
    mysql> select * from course;   # 发现原始表的记录也跟着修改了
    +-----+--------+------------+
    | cid | cname  | teacher_id |
    +-----+--------+------------+
    |   1 | 化学 |          1 |
    |   2 | 体育 |          1 |
    |   3 | 物理 |          2 |
    |   4 | 语文 |          3 |
    |   5 | 数学 |          4 |
    |   6 | 英语 |          5 |
    |   7 | 地理 |          2 |
    |   8 | 历史 |          3 |
    +-----+--------+------------+
    8 rows in set (0.00 sec)
    

      

    三 修改视图

    语法:ALTER VIEW 视图名称 AS SQL语句
    mysql> alter view teacher_view as select * from course where cid>3;
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> select * from teacher_view;
    +-----+-------+------------+
    | cid | cname | teacher_id |
    +-----+-------+------------+
    |   4 | xxx   |          2 |
    |   5 | yyy   |          2 |
    +-----+-------+------------+
    rows in set (0.00 sec)
    

      

    四 删除视图

    语法:DROP VIEW 视图名称
    
    DROP VIEW teacher_view
    

      

  • 相关阅读:
    net core 3.1 发布问题
    KCF追踪方法流程原理
    2
    1
    0
    LK光流算法公式详解
    MySql单表最大8000W+ 之数据库遇瓶颈记
    Quartz.net基于数据库的任务调度管理(Only.Jobs)
    轻量级代码生成器-OnlyCoder 第二篇
    轻量级代码生成器-OnlyCoder 第一篇
  • 原文地址:https://www.cnblogs.com/mike-liu/p/9349638.html
Copyright © 2011-2022 走看看