MySQL视图

一、视图

1.1 视图概述

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

1.2 视图的优点

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

1.3 视图与表的区别及联系

视图与表的区别

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

视图与表之间的联系

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

二、视图的基本操作

2.1 创建单表视图

mysql> create table test(quantity int,price int);
#创建表
mysql> insert into test values(3,50);
#插入数据
mysql> create view view_test as select quantity,price,quantity*price as total from test;
#创建视图
mysql> select * from view_test;
+----------+-------+-------+
| quantity | price | total |
+----------+-------+-------+
|        3 |    50 |   150 |
+----------+-------+-------+
#查看视图中的内容

2.2 创建多表视图

mysql> create table student (
    -> s_id int(3) primary key,
    -> s_name varchar(30),
    -> s_age int(3),
    -> s_sex varchar(8) );
mysql> create table stu_info (
    -> s_id int(3),
    -> class varchar(50),
    -> addr varchar(100) );
#创建基本表
mysql> insert into stu_info values
    -> (1,'erban','anhui'),
    -> (2,'sanban','chongqing'),
    -> (3,'yiban','shangdong');
#插入数据
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;
#创建视图
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    |       |
+-------+-------------+------+-----+---------+-------+
#查看视图的结构
mysql> show table status like 'stu_class'G;
#查看视图的基本信息
mysql> show create view stu_classG;
#查看视图的详细信息
mysql> select * from information_schema.viewsG;
#直接查询information_schema库中的views表,来查看所有的视图
mysql> select * from information_schema.views where table_schema = 't1';
#where后面指定一个库名,也就是查看t1库中的所有视图

2.3 修改视图

① 方式一
mysql> create or replace view view_test as select * from test;
#创建视图
mysql> select * from view_test;
#查看视图
+----------+-------+
| quantity | price |
+----------+-------+
|        3 |    50 |
+----------+-------+
② 方式二
mysql> alter view view_test(abc) as select quantity from test;
#修改时指定视图的列名
mysql> desc view_test;
#查看修改后的表结构
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| abc   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
mysql> select * from view_test;
#查看修改后的视图
+------+
| abc  |
+------+
|    3 |
+------+

2.5 更新视图

① update指令更新
mysql> select * from test;
+----------+-------+
| quantity | price |
+----------+-------+
|        3 |    50 |
+----------+-------+
mysql> select * from view_test;
+------+
| abc  |
+------+
|    3 |
+------+
#查看表以及视图的数据,其中quantity对应视图的abc字段
mysql> update view_test set abc = 5;
#更新视图
mysql> select * from test;
#查看更新后的表
+----------+-------+
| quantity | price |
+----------+-------+
|        5 |    50 |
+----------+-------+
mysql> select * from view_test;
#查看更新后的视图
+------+
| abc  |
+------+
|    5 |
+------+
② insert指令更新
mysql> select * from test;
#查看表数据
+----------+-------+
| quantity | price |
+----------+-------+
|        5 |    50 |
+----------+-------+
mysql> select * from view_test;
#查看视图数据
+------+
| abc  |
+------+
|    5 |
+------+
mysql> insert into test values(3,5);
#向表中插入数据
mysql> select * from view_test;
#查看更新后的视图数据
+------+
| abc  |
+------+
|    5 |
|    3 |
+------+
mysql> select * from test;
#查看更新后表数据
+----------+-------+
| quantity | price |
+----------+-------+
|        5 |    50 |
|        3 |     5 |
+----------+-------+
③ delete指令删除表数据
mysql> create view view_test2(quantity,price,total) as select quantity,price,quantity*price from test;
#创建新的视图
mysql> select * from view_test2;
#查看视图内容
+----------+-------+-------+
| quantity | price | total |
+----------+-------+-------+
|        5 |    50 |   250 |
|        3 |     5 |    15 |
+----------+-------+-------+
mysql> delete from view_test2 where price = 5;
#删除视图的数据
mysql> select * from view_test2;
+----------+-------+-------+
| quantity | price | total |
+----------+-------+-------+
|        5 |    50 |   250 |
+----------+-------+-------+
mysql> select * from test;
+----------+-------+
| quantity | price |
+----------+-------+
|        5 |    50 |
+----------+-------+
#查看更新后的视图、表数据

2.6 删除视图

mysql> drop view view_test2;
#删除指定视图
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
原文地址:https://www.cnblogs.com/lvzhenjiang/p/14197089.html