MySQL-视图

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL-视图

视图是什么?


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

视图的优点


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

创建视图


语法格式:

1. ALTER
2.     [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
3.     [DEFINER = user]
4.     VIEW view_name [(column_list)]
5.     AS select_statement
6.     [WITH [CASCADED | LOCAL] CHECK OPTION]

注释:

Undefined:不常用。

merge :表示将使用的视图语句与视图定义合并起来,使视图定义的某一部分取代语句对应的部分

temptable :表示将视图的结果存入临时表,然后用临时表来执行语句with[cascaded|local]

Cascaded :默认为cascaded,表示更新视图时,满足所有相关视图和表的条件

Local :表示更新视图时,满足该视图本身定义的条件即可

创建单表视图

1. mysql> create table t(quantity int,price int);
2. Query OK, 0 rows affected (0.02 sec)
3. 
4. mysql> insert into t values(3,50);
5. Query OK, 1 row affected (0.00 sec)
6. 
7. mysql> create view view_t as select quantity,price,quantity*price from t;       #创建view_t视图
8. Query OK, 0 rows affected (0.01 sec)

查看

1. mysql> select * from view_t;
2. +----------+-------+----------------+
3. | quantity | price | quantity*price |
4. +----------+-------+----------------+
5. |        3 |    50 |            150 |
6. +----------+-------+----------------+
7. 1 row in set (0.00 sec)
8. mysql> create view view_t2(qty,price,total) as 
9.     -> select quantity,price,quantity*price 
10.     -> from t;
11. Query OK, 0 rows affected (0.00 sec)
12. 
13. mysql> select * from view_t2;
14. +------+-------+-------+
15. | qty  | price | total |
16. +------+-------+-------+
17. |    3 |    50 |   150 |
18. +------+-------+-------+
19. 1 row in set (0.00 sec)

创建多表视图

1. mysql> create table student(
2.     -> s_id int primary key,
3.     -> s_name varchar(30),
4.     -> s_age int,
5.     -> s_sex varchar(8));
6. Query OK, 0 rows affected (0.00 sec)
7. 
8. mysql> create table stu_info(
9.     -> s_id int,
10.     -> class varchar(50),
11.     -> addr varchar(100));
12. Query OK, 0 rows affected (0.00 sec)
13. 
14. mysql> insert into stu_info(s_id,class,addr)
15.     -> values
16.     -> (1,'erban','anhui'),
17.     -> (2,'sanban','chongqing'),
18.     -> (3,'yiban','shangdong');
19. Query OK, 3 rows affected (0.01 sec)
20. Records: 3  Duplicates: 0  Warnings: 0
21. 
22. 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;
23. Query OK, 0 rows affected (0.00 sec)

查看视图的结构信息

语法格式:Describe 视图名

1. mysql> desc stu_class;
2. +-------+-------------+------+-----+---------+-------+
3. | Field | Type        | Null | Key | Default | Extra |
4. +-------+-------------+------+-----+---------+-------+
5. | id    | int(11)     | NO   |     | NULL    |       |
6. | name  | varchar(30) | YES  |     | NULL    |       |
7. | class | varchar(50) | YES  |     | NULL    |       |
8. +-------+-------------+------+-----+---------+-------+
9. 3 rows in set (0.01 sec)

查看视图的基本信息

语法格式:Show table status like ‘视图名’\G;

1. mysql> show table status like 'stu_class'\G
2. *************************** 1. row ***************************
3.            Name: stu_class
4.          Engine: NULL
5.         Version: NULL
6.      Row_format: NULL
7.            Rows: NULL
8.  Avg_row_length: NULL
9.     Data_length: NULL
10. Max_data_length: NULL
11.    Index_length: NULL
12.       Data_free: NULL
13.  Auto_increment: NULL
14.     Create_time: NULL
15.     Update_time: NULL
16.      Check_time: NULL
17.       Collation: NULL
18.        Checksum: NULL
19.  Create_options: NULL
20.         Comment: VIEW
21. 1 row in set (0.01 sec)

查看视图的详细信息

语法格式:Show create view 视图名;

或show create view 视图名\G

1. mysql> show create view view_t\G
2. *************************** 1. row ***************************
3.                 View: view_t
4.          Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_t` AS select `t`.`quantity` AS `quantity`,`t`.`price` AS `price`,(`t`.`quantity` * `t`.`price`) AS `quantity*price` from `t`
5. character_set_client: utf8
6. collation_connection: utf8_general_ci
7. 1 row in set (0.00 sec)

在mysql中,information schema 数据库下的views表中存储了所有视图的定义。通过对views表的查询,可以查看数据库中所有视图的详细信息。

mysql> select * from information_schema.views\G

修改视图


语法格式:

1. ALTER
2.     VIEW view_name [(column_list)]
3.     AS select_statement
4.     [WITH [CASCADED | LOCAL] CHECK OPTION]
5. mysql> create or replace view view_t as select * from t;
6. Query OK, 0 rows affected (0.00 sec)
1. mysql> desc view_t;
2. +----------+---------+------+-----+---------+-------+
3. | Field    | Type    | Null | Key | Default | Extra |
4. +----------+---------+------+-----+---------+-------+
5. | quantity | int(11) | YES  |     | NULL    |       |
6. | price    | int(11) | YES  |     | NULL    |       |
7. +----------+---------+------+-----+---------+-------+
8. 2 rows in set (0.00 sec)

修改视图

1. mysql> alter view view_t as select quantity from t;
2. Query OK, 0 rows affected (0.00 sec)
3. 
4. mysql> desc view_t;
5. +----------+---------+------+-----+---------+-------+
6. | Field    | Type    | Null | Key | Default | Extra |
7. +----------+---------+------+-----+---------+-------+
8. | quantity | int(11) | YES  |     | NULL    |       |
9. +----------+---------+------+-----+---------+-------+
10. 1 row in set (0.00 sec)

更新视图

  1. update
1. mysql> select *from t;
2. +----------+-------+
3. | quantity | price |
4. +----------+-------+
5. |        3 |    50 |
6. +----------+-------+
7. 1 row in set (0.00 sec)
8. 
9. mysql> select * from view_t;
10. +----------+
11. | quantity |
12. +----------+
13. |        3 |
14. +----------+
15. 1 row in set (0.00 sec)
16. 
17. mysql> update view_t set quantity=5;                #这个操作是quantity列全部都为5,加where可以指定某行
18. Query OK, 1 row affected (0.00 sec)
19. Rows matched: 1  Changed: 1  Warnings: 0
20. 
21. mysql> select *from view_t;
22. +----------+
23. | quantity |
24. +----------+
25. |        5 |
26. +----------+
27. 1 row in set (0.00 sec)
28. 
29. mysql> select * from t;
30. +----------+-------+
31. | quantity | price |
32. +----------+-------+
33. |        5 |    50 |
34. +----------+-------+
35. 1 row in set (0.00 sec)
  1. Insert
1. mysql> insert into t values(3,5);
2. Query OK, 1 row affected (0.00 sec)
3. 
4. mysql> select * from t;
5. +----------+-------+
6. | quantity | price |
7. +----------+-------+
8. |        5 |    50 |
9. |        3 |     5 |
10. +----------+-------+
11. 2 rows in set (0.00 sec)
12. 
13. mysql> select * from view_t2;
14. +------+-------+-------+
15. | qty  | price | total |
16. +------+-------+-------+
17. |    5 |    50 |   250 |
18. |    3 |     5 |    15 |
19. +------+-------+-------+
20. 2 rows in set (0.00 sec)
  1. delete
1. mysql> select * from view_t2;
2. +------+-------+-------+
3. | qty  | price | total |
4. +------+-------+-------+
5. |    5 |    50 |   250 |
6. |    3 |     5 |    15 |
7. +------+-------+-------+
8. 2 rows in set (0.00 sec)
9. 
10. mysql> delete from view_t2 where price=5;
11. Query OK, 1 row affected (0.00 sec)
12. 
13. mysql> select * from view_t2;
14. +------+-------+-------+
15. | qty  | price | total |
16. +------+-------+-------+
17. |    5 |    50 |   250 |
18. +------+-------+-------+
19. 1 row in set (0.00 sec)

视图存在以下情况时,更新操作无法执行

  1. 视图中不包含基表中被定义为非空的列
  2. 在定义视图的select语句后的字段列表中使用了数学表达式
  3. 在定义视图的select 语句后字段列表中使用了聚合函数时不接受更新操作
  4. select中,使用了union \top \group by 或having 无法接受

删除视图


语法格式:

DROP VIEW [IF EXISTS]

view_name1 [, view_name2] ...

1. mysql> drop view if exists stu_class;
2. Query OK, 0 rows affected (0.00 sec)
3. 
4. mysql> drop view if exists stu_class;
5. Query OK, 0 rows affected, 1 warning (0.00 sec)
6. 
7. mysql> show warnings;
8. +-------+------+-------------------------------+
9. | Level | Code | Message                       |
10. +-------+------+-------------------------------+
11. | Note  | 1051 | Unknown table 'bbs.stu_class' |
12. +-------+------+-------------------------------+
13. 1 row in set (0.00 sec)
14. 
15. mysql> show create view stu_class;
16. ERROR 1146 (42S02): Table 'bbs.stu_class' doesn't exist

扩展

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

1、两者的区别:

(1)视图是已经编译好的SQL语句,是基于SQL语句的结果集的可视化的表,而表不是。

(2)视图没有实际的物理记录,而表有。

(3)表是内容,视图窗口

(4)表和视图虽然都占用物理空间,但是视图只是逻辑概念存在,而表可以及时对数据进行修改,但是视图只能用创建语句来修改

(5)视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL 语句的集合。从安全角度来说,视图可以防止用户接触数据表,因而不知道表结构

(6)表属于全局模式中的表,是实表。而视图属于局部模式的表,是虚表

(7)视图的建立和删除只影响视图本身,而不影响对应表的基本表

2、两者的联系

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


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(8)作者——LJS[含MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;注意点及常见报错问题所对应的解决方法]
MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;举例说明注意点及常见报错问题所对应的解决方法
|
5月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
5月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
2月前
|
SQL 存储 关系型数据库
mysql-视图的定义和简单使用
这篇文章介绍了MySQL中视图的定义和简单使用方法,包括视图的创建规则和使用限制。通过一个实际的例子,展示了如何创建视图以及如何使用视图来简化复杂的SQL查询操作。
mysql-视图的定义和简单使用
|
2月前
|
存储 缓存 关系型数据库
MySQL 视图:数据库中的灵活利器
视图是数据库中的虚拟表,由一个或多个表的数据经筛选、聚合等操作生成。它不实际存储数据,而是动态从基础表中获取。视图可简化数据访问、增强安全性、提供数据独立性、实现可重用性并提高性能,是管理数据库数据的有效工具。
|
3月前
|
存储 关系型数据库 MySQL
|
4月前
|
SQL 安全 关系型数据库
MySQL创建视图(CREATE VIEW)13
【7月更文挑战第13天】创建视图是指在已经存在的 MySQL 数据库表上建立视图。视图可以建立在一张表中,也可以建立在多张表中。
67 1
|
5月前
|
缓存 DataWorks 关系型数据库
DataWorks产品使用合集之如何抽取MySQL视图数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
95 4
|
4月前
|
存储 数据可视化 关系型数据库
深入理解 MySQL 视图
深入理解 MySQL 视图
40 2
|
5月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)