心得经验总结:深入解析MySQL视图VIEW

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 心得经验总结:深入解析MySQL视图VIEW

阅读目录---深入解析MySQL视图

1、创建视图

2、查看视图

3、视图的更改

  1、create or replace view

  2、alter

  3、DML

  4、drop

4、使用with check option约束

  嵌套视图

5、定义视图时的其他选项:algorithm、definer、SQL security视图权限

6、视图查询语句的处理

  1、替代方法

  2、具体化方法

Q:什么是视图?视图是干什么用的?

A:

  视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。

  通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。

基表:用来创建视图的表叫做基表base table

Q:为什么要使用视图?

A:因为视图的诸多优点,如下

  1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

  2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

  3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。

一、创建视图

CREATE 【OR REPLACE】 【ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}】

VIEW view_name 【(column_list)】

AS select_statement

【WITH 【CASCADED | LOCAL】 CHECK OPTION】

1)OR REPLACE:表示替换已有视图

2)ALGORITHM:表示视图选择算法,默认算法是UNDEFINED(未定义的):MySQL自动选择要使用的算法 ;merge合并;temptable临时表

3)select_statement:表示select语句

4)【WITH 【CASCADED | LOCAL】 CHECK OPTION】:表示视图在更新时保证在视图的权限范围之内

  cascade是默认值,表示更新视图的时候,要满足视图和表的相关条件

  local表示更新视图的时候,要满足该视图定义的一个条件即可

TIPS:推荐使用WHIT 【CASCADED|LOCAL】 CHECK OPTION选项,可以保证数据的安全性

基本格式:

  create view 【(column_list)】

as select语句

with check option;

1、在单表上创建视图

-> as

-> select PLAYERNO,NAME,SEX,PHONENO from PLAYERS

-> where SEX='F'

-> with check option;

Query OK, 0 rows affected (0.00 sec)

mysql

++--+--+-+-+---+

| Field | Type | Null | Key | Default | Extra |

++--+--+-+-+---+

| 编号 | int(11) | NO | | NULL | |

| 名字 | char(15) | NO | | NULL | |

| 性别 | char(1) | NO | | NULL | |

++--+--+-+-+---+

4 rows in set (0.00 sec)

mysql

++---+++

++---+++

| 8 | Newcastle | F | 070-458458 |

| 27 | Collins | F | 079-234857 |

| 28 | Collins | F | 010-659599 |

| 104 | Moorman | F | 079-987571 |

| 112 | Bailey | F | 010-548745 |

++---+++

5 rows in set (0.02 sec)

2、在多表上创建视图

mysql> create view v_match

-> as

-> select a.PLAYERNO,a.NAME,MATCHNO,WON,LOST,c.TEAMNO,c.DIVISION

-> from

-> PLAYERS a,MATCHES b,TEAMS c

-> where a.PLAYERNO=b.PLAYERNO and b.TEAMNO=c.TEAMNO;

Query OK, 0 rows affected (0.03 sec)

mysql

+--+---+-+-+--++--+

| PLAYERNO | NAME | MATCHNO | WON | LOST | TEAMNO | DIVISION |

+--+---+-+-+--++--+

| 6 | Parmenter | 1 | 3 | 1 | 1 | first |

| 44 | Baker | 4 | 3 | 2 | 1 | first //代码效果参考:http://www.zidongmutanji.com/zsjx/203597.html

|

| 83 | Hope | 5 | 0 | 3 | 1 | first |

| 112 | Bailey | 12 | 1 | 3 | 2 | second |

| 8 | Newcastle | 13 | 0 | 3 | 2 | second |

+--+---+-+-+--++--+

5 rows in set (0.04 sec)

视图将我们不需要的数据过滤掉,将相关的列名用我们自定义的列名替换。视图作为一个访问接口,不管基表的表结构和表名有多复杂。

  如果创建视图时不明确指定视图的列名,那么列名就和定义视图的select子句中的列名完全相同;

  如果显式的指定视图的列名就按照指定的列名。

注意:显示指定视图列名,要求视图名后面的列的数量必须匹配select子句中的列的数量。

【回到顶部】

二、查看视图

1、使用show create view语句查看视图信息

mysql> show create view v_F_players\G;

* 1. row *

View: v_F_players

character_set_client: utf8

collation_connection: utf8_general_ci

1 row in set (0.00 sec)

2、视图一旦创建完毕,就可以像一个普通表那样使用,视图主要用来查询

mysql> select from //代码效果参考:http://www.zidongmutanji.com/zsjx/256351.html

view_name;

3、有关视图的信息记录在information_schema数据库中的views表中

mysql> select from information_schema.views

-> where TABLE_NAME='v_F_players'\G;

* 1. row *

TABLE_CATALOG: def

TABLE_SCHEMA: TENNIS

TABLE_NAME: v_F_players

CHECK_OPTION: CASCADED

IS_UPDATABLE: YES

DEFINER: root@localhost

SECURITY_TYPE: DEFINER

CHARACTER_SET_CLIENT: utf8

COLLATION_CONNECTION: utf8_general_ci

1 row in set (0.00 sec)

【回到顶部】

三、视图的更改

1、CREATE OR REPLACE VIEW语句修改视图

基本格式:

  create or replace view view_name as select语句;

在视图存在的情况下可对视图进行修改,视图不在的情况下可创建视图

2、ALTER语句修改视图

ALTER

【ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}】

//代码效果参考:http://www.zidongmutanji.com/zsjx/135325.html

【DEFINER = { user | CURRENT_USER }】

【SQL SECURITY { DEFINER | INVOKER }】

VIEW view_name 【(column_list)】

AS select_statement

【WITH 【CASCADED | LOCAL】 CHECK OPTION】

注意:修改视图是指修改数据库中已存在的表的定义,当基表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致

3、DML操作更新视图

  因为视图本身没有数据,因此对视图进行的dml操作最终都体现在基表中

mysql> create view v_student as select from student;

mysql</span] select from v_student;

+++--+

| 学号 | name | sex |

+++--+

| 1 | 张三 | M |

| 2 | 李四 | F |

| 5 | 王五 | NULL |

+++--+

mysql

mysql

+++--+

| 学号 | name | sex |

+++--+

| 1 | 钱六 | M |

| 2 | 李四 | F |

| 5 | 王五 | NULL |

+++--+

当然,视图的DML操作,不是所有的视图都可以做DML操作。

有下列内容之一,视图不能做DML操作:

  ①select子句中包含distinct

  ②select子句中包含组函数

  ③select语句中包含group by子句

  ④select语句中包含order by子句

  ⑤select语句中包含union 、union all等集合运算符

  ⑥where子句中包含相关子查询

  ⑦from子句中包含多个表

  ⑧如果视图中有计算列,则不能更新

  ⑨如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作

4、drop删除视图

  删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说不动基表:

DROP VIEW 【IF EXISTS】

view_name 【, view_name】 ...

mysql> drop view v_student;

如果视图不存在,则抛出异常;使用IF EXISTS选项使得删除不存在的视图时不抛出异常。

【回到顶部】

四、使用WITH CHECK OPTION约束

对于可以执行DML操作的视图,定义时可以带上WITH CHECK OPTION约束

作用:

  对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制。

示例:创建视图,包含1960年之前出生的所有球员(老兵)

mysql> create view v_veterans

-> as

-> select from PLAYERS

-> where birth_date < '1960-01-01'

-> with check option;

Query OK, 0 rows affected (0.01 sec)

mysql</span] select from v_veterans;

+--+-+--++-+++-+--+---++--+

| PLAYERNO | NAME | INITIALS | BIRTH_DATE | SEX | JOINED | STREET | HOUSENO | POSTCODE | TOWN | PHONENO | LEAGUENO |

+--+-+--++-+++-+--+---++--+

| 2 | Everett | R | 1948-09-01 | M | 1975 | Stoney Road | 43 | 3575NH | Stratford | 070-237893 | 2411 |

| 39 | Bishop | D | 1956-10-29 | M | 1980 | Eaton Square | 78 | 9629CD | Stratford |

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
3月前
|
存储 SQL 关系型数据库
MySQL中binlog、redolog与undolog的不同之处解析
每个都扮演回答回溯与错误修正机构角色: BinLog像历史记载员详细记载每件大大小小事件; RedoLog则像紧急救援队伍遇见突發情況追踪最后活动轨迹尽力补救; UndoLog就类似时间机器可倒带历史让一切归位原始样貌同时兼具平行宇宙观察能让多人同时看见各自期望看见历程而互不干扰.
224 9
|
4月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
133 2
|
11月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
2412 10
|
4月前
|
存储 SQL 关系型数据库
MySQL 核心知识与性能优化全解析
我整理的这份内容涵盖了 MySQL 诸多核心知识。包括查询语句的书写与执行顺序,多表查询的连接方式及内、外连接的区别。还讲了 CHAR 和 VARCHAR 的差异,索引的类型、底层结构、聚簇与非聚簇之分,以及回表查询、覆盖索引、左前缀原则和索引失效情形,还有建索引的取舍。对比了 MyISAM 和 InnoDB 存储引擎的不同,提及性能优化的多方面方法,以及超大分页处理、慢查询定位与分析等,最后提到了锁和分库分表可参考相关资料。
125 0
|
5月前
|
关系型数据库 MySQL
MySQL字符串拼接方法全解析
本文介绍了四种常用的字符串处理函数及其用法。方法一:CONCAT,用于基础拼接,参数含NULL时返回NULL;方法二:CONCAT_WS,带分隔符拼接,自动忽略NULL值;方法三:GROUP_CONCAT,适用于分组拼接,支持去重、排序和自定义分隔符;方法四:算术运算符拼接,仅适用于数值类型,字符串会尝试转为数值处理。通过示例展示了各函数的特点与应用场景。
|
7月前
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
10月前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合
2024年小结:感谢阿里云开发者社区每月的分享交流活动,支持持续学习和进步。过去五个月投稿29篇,其中17篇获高分认可。本文详细介绍了MySQL InnoDB存储引擎的MVCC机制,包括数据版本链、readView视图及解决脏读、不可重复读、幻读问题的demo演示。
|
8月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
834 29
|
8月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
332 4
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多