zoukankan      html  css  js  c++  java
  • 视图

    视图的定义:  

      视图是虚拟表或逻辑表,它被定义为具有连接的SQL,select查询语句,因为数据库视图与数据库表类似,它由行和列组成,因此可以根据数据库查询数据,其内容由查询定义。但是,视图并不在数据库中以存储数据集形式存在,行和列数据来自由定义视图的查询所用的表,并且在引用视图时动态生成,简单的来说视图是由其定义结果组成的表。

    视图的优点:

      1,数据库视图允许简化复杂查询,通过数据库视图,您只需使用简单的SQL语句,而不是使用具有多个连接的复杂的SQL语句。

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

    视图的缺点:

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

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

    创建视图:

    create view 视图名称 as SQL语句
    #两张有关系的表
    mysql> select * from course;
    +-----+--------+------------+
    | cid | cname  | teacher_id |
    +-----+--------+------------+
    |   1 | 生物   |          1 |
    |   2 | 物理   |          2 |
    |   3 | 体育   |          3 |
    |   4 | 美术   |          2 |
    +-----+--------+------------+
    rows in set (0.00 sec)
    
    mysql> select * from teacher;
    +-----+-----------------+
    | tid | tname           |
    +-----+-----------------+
    |   1 | 张磊老师        |
    |   2 | 李平老师        |
    |   3 | 刘海燕老师      |
    |   4 | 朱云海老师      |
    |   5 | 李杰老师        |
    +-----+-----------------+
    rows in set (0.00 sec)
    
    #查询李平老师教授的课程名
    mysql> select cname from course where teacher_id = (select tid from teacher where tname='李平老师');
    +--------+
    | cname  |
    +--------+
    | 物理   |
    | 美术   |
    +--------+
    rows in set (0.00 sec)
    
    #子查询出临时表,作为teacher_id等判断依据
    select tid from teacher where tname='李平老师'

    视图的创建:

    create view teacher_view as select tid from teacher where tname='李平老师';
    
    #于是查询李平老师教授的课程名的sql可以改写为
    mysql> select cname from course where teacher_id = (select tid from teacher_view);
    +--------+
    | cname  |
    +--------+
    | 物理   |
    | 美术   |
    +--------+
    rows in set (0.00 sec)

    使用视图:

      往物理表中插入一条数据,查看视图,发现视图表也会跟着更新。

     insert into course values(5,'地理',2);

      更新一下数据,发现视图的数据也会跟着更新:

    update course set cname = '历史';

    不能修改视图的数据:

    mysql> create view tt as select * from course left join teacher on teacher.tid = course.teacher_id;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> select * from tt;
    +-----+--------+------------+------+-----------------+
    | cid | cname  | teacher_id | tid  | tname           |
    +-----+--------+------------+------+-----------------+
    |   1 | 王五   |          1 |    1 | 张磊老师        |
    |   2 | 王五   |          2 |    2 | 丽萍老师        |
    |   4 | 王五   |          2 |    2 | 丽萍老师        |
    |   5 | 王五   |          2 |    2 | 丽萍老师        |
    |   6 | 王五   |          2 |    2 | 丽萍老师        |
    |   3 | 王五   |          3 |    3 | 王海燕老师      |
    +-----+--------+------------+------+-----------------+
    6 rows in set (0.01 sec)
    
    mysql> insert into tt values(7,'哈哈',2,4,'张三丰老师');
    ERROR 1471 (HY000): The target table tt of the INSERT is not insertable-into

    修改视图: 

    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 视图名称
  • 相关阅读:
    sqlserver计算时间差DATEDIFF 函数
    C# join 子句(C# 参考)
    C# join 子句(C# 参考)
    MongoDB 监控备份工具MMS
    MongoDB 监控备份工具MMS
    mongodb$slice (aggregation)
    mongodb$slice (aggregation)
    1004:字符三角形
    1004:字符三角形
    1003:对齐输出
  • 原文地址:https://www.cnblogs.com/stfei/p/9187508.html
Copyright © 2011-2022 走看看