zoukankan      html  css  js  c++  java
  • MySql学习12---视图

    一. 视图介绍

    1.1 视图的含义

    视图是一个虚拟表,是从数据库中一个或多个表中导出来的表。视图还可以从已经存在的视图的基础上定义。

    通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

    1.2 视图的特点

    视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改和删除。当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化;同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。

    1.3 视图的作用

    方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;

    更加安全,数据库授权命令不能限定到特定行和特定列,但是通过合理创建视图,可以把权限限定到行列级别;

    二. 创建视图

    视图中包含了SELECT查询的结果,因此视图的创建基于SELECT语句和已存在的数据表。

    2.1 如何创建视图

    创建视图就是采用  create view 视图名 as  select语句     就好。

    2.2 在单表上创建视图

     1 mysql> create table user(id int,name varchar(30));
     2 Query OK, 0 rows affected (0.05 sec)
     3 
     4 mysql> insert into user(id,name) values(1,'zhangsan'),(2,'lisi'),(3,'wangwu');
     5 Query OK, 3 rows affected (0.02 sec)
     6 Records: 3  Duplicates: 0  Warnings: 0
     7 
     8 mysql> select *from user;
     9 +------+----------+
    10 | id   | name     |
    11 +------+----------+
    12 |    1 | zhangsan |
    13 |    2 | lisi     |
    14 |    3 | wangwu   |
    15 +------+----------+
    16 3 rows in set (0.00 sec)
    17 
    18 mysql> create view view_user as select name from user;
    19 Query OK, 0 rows affected (0.02 sec)
    20 
    21 mysql> select *from view_user;
    22 +----------+
    23 | name     |
    24 +----------+
    25 | zhangsan |
    26 | lisi     |
    27 | wangwu   |
    28 +----------+
    29 3 rows in set (0.00 sec)
    30 
    31 mysql> create view view_user2(view_name) as select name from user;
    32 Query OK, 0 rows affected (0.02 sec)
    33 
    34 mysql> select *from view_user2;
    35 +-----------+
    36 | view_name |
    37 +-----------+
    38 | zhangsan  |
    39 | lisi      |
    40 | wangwu    |
    41 +-----------+
    42 3 rows in set (0.00 sec)
    43 
    44 mysql>
    View Code

    说明:在创建视图view_user和view_user2的时候,可以指定视图中应该包含的字段名字。如果不指定,就默认时表格中的字段名字。反正属性是一样的,比如都是varchar(30)

    2.3 在多个表上创建视图

    比如:有一个student表,包含学号和姓名;还有一个表info表,包含学号,班级,成绩;但是最终成绩单上只想保存学号,姓名,成绩这3个字段该怎么办呢,这个时候就可以在多个表上创建一个视图t,让它只包含这三个字段。

     1 mysql> create table stu(
     2     -> id int,
     3     -> name varchar(30));
     4 Query OK, 0 rows affected (0.05 sec)
     5 
     6 mysql> insert into stu(id,name) values(1,'zhangsan'),(2,'lisi'),(3,'wangwu');
     7 Query OK, 3 rows affected (0.01 sec)
     8 Records: 3  Duplicates: 0  Warnings: 0
     9 
    10 mysql> select *from stu;
    11 +------+----------+
    12 | id   | name     |
    13 +------+----------+
    14 |    1 | zhangsan |
    15 |    2 | lisi     |
    16 |    3 | wangwu   |
    17 +------+----------+
    18 3 rows in set (0.00 sec)
    View Code
     1 mysql> create table info(
     2     -> id int,
     3     -> classNum int,
     4     -> grade int);
     5 Query OK, 0 rows affected (0.04 sec)
     6 
     7 mysql> insert into info(id,classNum,grade) values(1,1,98),(2,2,89),(3,3,78);
     8 Query OK, 3 rows affected (0.01 sec)
     9 Records: 3  Duplicates: 0  Warnings: 0
    10 
    11 mysql> select *from info;
    12 +------+----------+-------+
    13 | id   | classNum | grade |
    14 +------+----------+-------+
    15 |    1 |        1 |    98 |
    16 |    2 |        2 |    89 |
    17 |    3 |        3 |    78 |
    18 +------+----------+-------+
    View Code

    创建视图:

     1 mysql> create view t as select stu.id,stu.name,info.grade from stu,info where stu.id=info.id;
     2 Query OK, 0 rows affected (0.02 sec)
     3 
     4 mysql> select *from t;
     5 +------+----------+-------+
     6 | id   | name     | grade |
     7 +------+----------+-------+
     8 |    1 | zhangsan |    98 |
     9 |    2 | lisi     |    89 |
    10 |    3 | wangwu   |    78 |
    11 +------+----------+-------+
    12 3 rows in set (0.00 sec)
    View Code

    三. 查看视图

    类似表格中的查看语句

    3.1 采用DESCRIBE语句查看视图基本信息

    DESCRIBE 视图名;

    1 mysql> describe t;
    2 +-------+-------------+------+-----+---------+-------+
    3 | Field | Type        | Null | Key | Default | Extra |
    4 +-------+-------------+------+-----+---------+-------+
    5 | id    | int(11)     | YES  |     | NULL    |       |
    6 | name  | varchar(30) | YES  |     | NULL    |       |
    7 | grade | int(11)     | YES  |     | NULL    |       |
    8 +-------+-------------+------+-----+---------+-------+
    9 3 rows in set (0.00 sec)
    View Code

    3.2 使用SHOW CREATE VIEW语句查看视图详细信息

    SHOW CREATE VIEW 视图名;

    四. 修改视图

    MySql中通过CREATE OR REPLACE VIEW语句和ALTER语句来修改视图。

    4.1 使用CREATE OR REPLACE VIEW语句修改视图

     1 mysql> create or replace view t as select * from stu;
     2 Query OK, 0 rows affected (0.02 sec)
     3 
     4 mysql> select *from t;
     5 +------+----------+
     6 | id   | name     |
     7 +------+----------+
     8 |    1 | zhangsan |
     9 |    2 | lisi     |
    10 |    3 | wangwu   |
    11 +------+----------+
    12 3 rows in set (0.00 sec)
    View Code

    4.2 使用ALTER语句修改视图

     1 mysql> alter view t as select name from user;
     2 Query OK, 0 rows affected (0.02 sec)
     3 
     4 mysql> select *from t;
     5 +----------+
     6 | name     |
     7 +----------+
     8 | zhangsan |
     9 | lisi     |
    10 | wangwu   |
    11 +----------+
    12 3 rows in set (0.00 sec)
    View Code

    五. 更新视图

    更新视图是指通过视图来插入、更新、删除表中的数据。因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是转到基本表上进行更新的,如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录。

    5.1  使用update语句更新视图

     1 mysql> select *from stu;
     2 +------+----------+
     3 | id   | name     |
     4 +------+----------+
     5 |    1 | zhangsan |
     6 |    2 | lisi     |
     7 |    3 | wangwu   |
     8 +------+----------+
     9 3 rows in set (0.00 sec)
    10 
    11 mysql> create view t1 as select name from stu where id=1;
    12 Query OK, 0 rows affected (0.02 sec)
    13 
    14 mysql> select *from t1;
    15 +----------+
    16 | name     |
    17 +----------+
    18 | zhangsan |
    19 +----------+
    20 1 row in set (0.00 sec)
    21 
    22 mysql> create view t2 as select name from stu where id=2;
    23 Query OK, 0 rows affected (0.02 sec)
    24 
    25 mysql> select *from t2;
    26 +------+
    27 | name |
    28 +------+
    29 | lisi |
    30 +------+
    31 1 row in set (0.00 sec)
    32 
    33 mysql> update t1 set name='zhangsan2';
    34 Query OK, 1 row affected (0.01 sec)
    35 Rows matched: 1  Changed: 1  Warnings: 0
    36 
    37 mysql> select *from t1;
    38 +-----------+
    39 | name      |
    40 +-----------+
    41 | zhangsan2 |
    42 +-----------+
    43 1 row in set (0.00 sec)
    44 
    45 mysql> select *from stu;
    46 +------+-----------+
    47 | id   | name      |
    48 +------+-----------+
    49 |    1 | zhangsan2 |      //发现对视图的修改,更新也会同步到基本表中;反之也是可以的
    50 |    2 | lisi      |
    51 |    3 | wangwu    |
    52 +------+-----------+
    53 3 rows in set (0.00 sec)
    54 
    55 mysql>
    View Code

    5.2 使用insert语句在基本表中插入一条记录

     1 mysql> select *from t1;
     2 +-----------+
     3 | name      |
     4 +-----------+
     5 | zhangsan2 |
     6 +-----------+
     7 1 row in set (0.00 sec)
     8 
     9 mysql> select *from t2;
    10 +------+
    11 | name |
    12 +------+
    13 | lisi |
    14 +------+
    15 1 row in set (0.00 sec)
    16 
    17 mysql> insert into stu values(1,'add1'),(2,'add2');
    18 Query OK, 2 rows affected (0.01 sec)
    19 Records: 2  Duplicates: 0  Warnings: 0
    20 
    21 mysql> select *from t1;
    22 +-----------+
    23 | name      |
    24 +-----------+
    25 | zhangsan2 |
    26 | add1      |
    27 +-----------+
    28 2 rows in set (0.00 sec)
    29 
    30 mysql> select *from t2;
    31 +------+
    32 | name |
    33 +------+
    34 | lisi |
    35 | add2 |
    36 +------+
    37 2 rows in set (0.00 sec)
    38 
    39 mysql>
    40 
    41 说明:因为t1视图的查询语句是select name from stu where id=1
    42               t2视图的查询语句是select name from stu where id=2
    43 因此,当执行一条insert语句后,id=1,2的地方都增加了数据,因此视图中也会增加数据
    View Code

    5.3 使用delete语句删除视图中的一条记录

     1 mysql> select *from stu;
     2 +------+-----------+
     3 | id   | name      |
     4 +------+-----------+
     5 |    1 | zhangsan2 |
     6 |    2 | lisi      |
     7 |    3 | wangwu    |
     8 |    1 | add1      |
     9 |    2 | add2      |
    10 +------+-----------+
    11 5 rows in set (0.00 sec)
    12 
    13 mysql> delete from t1 where name='zhangsan2';
    14 Query OK, 1 row affected (0.01 sec)
    15 
    16 mysql> select *from stu;
    17 +------+--------+
    18 | id   | name   |
    19 +------+--------+
    20 |    2 | lisi   |
    21 |    3 | wangwu |
    22 |    1 | add1   |
    23 |    2 | add2   |
    24 +------+--------+
    25 4 rows in set (0.00 sec)
    View Code

    Note:当视图中包含如下内容时,视图的更新操作将不能被执行:

    • 视图中不包含基表中被定义为非空的列;
    • 在定义视图的SELECT语句后的字段列表中使用了数学表达式;
    • 在定义视图的SELECT语句后的字段列表中使用聚合函数;
    • 在定义视图的SELECT语句中使用了DISTINCT,UNION, TOP, GOURP BY或HAVING子句

    六. 删除视图

    直接使用      DROP VIEW 视图名;

  • 相关阅读:
    7.20 高博教育 方法
    7.20 高博教育 随机数字(练习)
    7.17 高博教育 流程控制02
    7月17号 高博教育 复习加逻辑运算符
    7月16号 高博教育 知识扩展
    7月16号 高博教育 知识点总结
    7月16号 高博教育 数据运算符和比较运算符
    链式线性表——课上练
    顺序线性表——课上练
    链栈——课上练
  • 原文地址:https://www.cnblogs.com/Hermioner/p/10367122.html
Copyright © 2011-2022 走看看