MySQL之视图

什么是视图?

一张虚表,和真实的表一样。视图包含一系列带有名称的行和列数据。视图是从一个或多个表中导出来的,我们可以通过insert,update,delete来操作视图。当通过视图看到的数据被修改时,相应的原表的数据也会变化。同时原表发生变化,则这种变化也可以自动反映到视图中。

视图具有以下优点:

  1. 简单化:看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化操作。经常被使用的查询可以制作成一个视图;
  2. 安全性:通过视图用户只能查询和修改所能见到的数据,数据库中其他的数据既看不见也取不到。数据库授权命令可以让每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定的行,列上;
  3. 逻辑数据独立性:视图可帮助用户屏蔽真实表结构变化带来的影响。

视图和表的区别以及联系是什么?

两者的区别:

  • 视图是已经编译好的SQL语句,是基于SQL语句的结果集的可视化的表,而表不是;
  • 视图没有实际的物理记录,而表有;
  • 表是内容,视图窗口;
  • 表和视图虽然都占用物理空间,但是视图只是逻辑概念存在,而表可以及时对数据进行修改,但是视图只能用创建语句来修改 ;
  • 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL 语句的集合。从安全角度来说,视图可以防止用户接触数据表,因而不知道表结构 ;
  • 表属于全局模式中的表,是实表。而视图属于局部模式的表,是虚表;
  • 视图的建立和删除只影响视图本身,而不影响对应表的基本表。

两者的联系:

视图是在基本表之上建立的表,它的结构和内容都来自于基本表,它依赖基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本的抽象和逻辑意义上建立的关系。

一、创建视图

1、创建单表视图

#创建表
mysql> create table t(
    -> quantity int,
    -> price int
    -> );
#插入数据
mysql> insert into t values(3,50);
#创建视图
mysql> create view view_t as select quantity,price,quantity*price as total from t;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from view_t;               查看视图中的数据
+----------+-------+-------+
| quantity | price | total |
+----------+-------+-------+
|        3 |    50 |   150 |
+----------+-------+-------+
1 row in set (0.01 sec)

2、创建多表视图

#创建基本表
mysql> create table student(
    -> s_id int(3) primary key,
    -> s_name varchar(30),
    -> s_age int(3),
    -> s_sex varchar(8)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> create table stu_info(
    -> s_id int(3),
    -> class varchar(50),
    -> addr varchar(100)
    -> );
Query OK, 0 rows affected (0.01 sec)
#插入数据
mysql> insert into stu_info values
    -> (1,'erban','anhui'),
    -> (2,'sanban','chongqing'),
    -> (3,'yiban','shandong');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
#创建视图
mysql> create view stu_class(id,name,class) as                                                        
    -> select student.s_id,student.s_name,stu_info.class 
    -> from student,stu_info where student.s_id=stu_info.s_id;

3、查看视图的相关信息

#查看视图的表结构
mysql> desc stu_class;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(3)      | NO   |     | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
| class | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
#查看视图的基本信息
mysql> show table status like 'stu_class'\G
*************************** 1. row ***************************
           Name: stu_class
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW
1 row in set (0.00 sec)
#查看视图的详细信息
mysql> show create view stu_class\G
*************************** 1. row ***************************
                View: stu_class
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `stu_class` AS select `student`.`s_id` AS `id`,`student`.`s_name` AS `name`,`stu_info`.`class` AS `class` from (`student` join `stu_info`) where (`student`.`s_id` = `stu_info`.`s_id`)
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
#也可以直接查询information_schema库中的views表,来查看所有的视图
mysql> select * from information_schema.views where table_schema='test1'\G
#where后面指定的是一个库名,也就是查看test02这个库中的所有视图

4、修改视图 方法一:

mysql> create or replace view view_t as select * from t;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from view_t;           查看修改后的视图
+----------+-------+
| quantity | price |
+----------+-------+
|        3 |    50 |
+----------+-------+
1 row in set (0.00 sec)

方法二:

#修改指定视图的列名
mysql> alter view view_t(abc) as select quantity from t;
Query OK, 0 rows affected (0.00 sec)
#查看修改后的表结构
mysql> desc view_t;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| abc   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

5、更新视图 1)update指令更新

#查看表以及视图的数据,其中quantity对应视图的abc字段
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
|        3 |    50 |
+----------+-------+
1 row in set (0.00 sec)

mysql> select * from view_t;
+------+
| abc  |
+------+
|    3 |
+------+
1 row in set (0.01 sec)

mysql> update view_t set abc=5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
#查看更新后的视图
mysql> select * from view_t;
+------+
| abc  |
+------+
|    5 |
+------+
1 row in set (0.00 sec)
#查看更新后的表
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
|        5 |    50 |
+----------+-------+
1 row in set (0.00 sec)

2)insert指令更新

#查看表的数据
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
|        5 |    50 |
+----------+-------+
1 row in set (0.00 sec)
#查看视图的数据
mysql> select * from view_t;
+------+
| abc  |
+------+
|    5 |
+------+
1 row in set (0.00 sec)
#向表中插入数据
mysql> insert into t values(3,5);
Query OK, 1 row affected (0.00 sec)
#查看视图的数据
mysql> select * from view_t;
+------+
| abc  |
+------+
|    5 |
|    3 |
+------+
2 rows in set (0.00 sec)
#查看表的数据
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
|        5 |    50 |
|        3 |     5 |
+----------+-------+

3) delete指令删除表数据

#创建新的视图
mysql> create view view_t2(qty,price,total) as select quantity,price,quantity*price from t;
mysql> select * from view_t2;
+------+-------+-------+
| qty  | price | total |
+------+-------+-------+
|    5 |    50 |   250 |
|    3 |     5 |    15 |
+------+-------+-------+
2 rows in set (0.00 sec)
#删除视图中的数据
mysql> delete from view_t2 where price=5;
Query OK, 1 row affected (0.00 sec)
#再次查看视图的数据
mysql> select * from view_t2;
+------+-------+-------+
| qty  | price | total |
+------+-------+-------+
|    5 |    50 |   250 |
+------+-------+-------+
1 row in set (0.00 sec)
查看原表的数据
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
|        5 |    50 |
+----------+-------+
1 row in set (0.00 sec)

6、删除视图

mysql> drop view view_t;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 部署MySQL 5.7

    注:在安装MySQL前需要卸载掉当前已有的mariadb,然后需要安装gcc环境 1、安装cmake

    小手冰凉
  • Docker 构建容器Tomcat+Nginx+MySQL

    一、构建Tomcat Tomcat是一个免费开源的轻量级web服务器,在中小型企业和并发量不高的场合普遍使用,是开发和调试JSP程序的首选。下面使用Docker...

    小手冰凉
  • MySQL 之数据备份及恢复

    MySQL备份一般采用全库备份加日志备份的方式,根据业务的需要,可以采用每周日凌晨1点进行完全备份以及每小时进行一次增量备份,这样在MySQL故障后可以使用完全...

    小手冰凉
  • Science子刊封面:仅需20%信息,AI场景全再现!

    当我们给计算机视觉系统输入一张照片时,它们可以很容易捕获照片中的信息。但是,自主捕获信息对于计算机视觉系统还是非常困难的。

    新智元
  • 如何选择聚类模块数目

    一般来说,类似K-means聚类算法需要我们提取指定聚类得到的cluster数目。 那么问题来了,如何为聚类选择一个适合的cluster数目呢 ? 很遗憾,上面...

    生信技能树
  • 潮鹅诞生记 - 腾讯ISUX

    腾讯ISUX
  • IOS触摸事件分发机制详解

    本文从三个概念UIEvent,UIResponder、Hit-Testing、Responder Chain入手,为你详细讲解这句话的含义。

    MelonTeam
  • MySQL 主从配置详解

    版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://blog...

    shaonbean
  • Mysql主从同步架构配置

    老七Linux
  • Oracle自动性能统计

      高效诊断性能问题,需要提供完整可用的统计信息,好比医生给病人看病的望闻问切,才能够正确的确诊,然后再开出相应的药方。Oracle数据库为系统、会话以及单独的...

    Leshami

扫码关注云+社区

领取腾讯云代金券