MySQL的视图(二十二)上

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL的视图(二十二)上

一 . 视图


一.一 视图的出现


前面讲解了各种查询和子查询,如果要进行一个复杂功能的查询,那么就可能需要写很长很长的一个sql, 在代码中将这些sql进行硬编码进去,不便于后期维护和复用。 有没有一种技术,可以像使用表查询那样简单 (select * from 表名 ), 将那个很长很长的sql的查询结果封装到一个独特的表里面呢? 以后在查询的时候,直接查询那个独特的表即可? 实际上,数据库提供了这么一个技术, 这个技术叫做 视图 (view) .


视图(view) 和 表(table) 是有区别的。 表中的数据是一个真正存在的,存储于物理结构中, 而视图中的数据是虚拟的,

并不真实存在。


视图,常常适用于用于多个表连接查询之间的结果。


一.二 视图的优点


一.二.一 简单化


看到的,就是查询出来的。 直接 select * from 视图 即可, 并不需要向以前那样,写一个很长的sql语句(sql语句中,包括where,分组,排序等)


一.二.二 安全性


视图中只能查询和修改视图使用者所能看到的数据,不能维护其看不到的数据。 也就是, 表使用者和视图使用者,两个人的权限是不一样的, 从而保证了数据的安全性。


如在 user 表里面,存在以下数据:


select * from user;


2020040116192044.png


共九个数据。


那么, 表使用者可以看到这九个员工, 同样,也可以维护 这九个员工的信息。


如果将


select * from user where id=1;


20200401161929541.png


这一条数据,封装成视图, 那么,视图使用者只能看到这一个姓名为 ‘两个蝴蝶飞’ 的数据,也只能维护这一个员工的信息, 不能维护他看不到的,如 ‘岳泽霖’ 等这些数据。 从而,保证了重要数据的安全性。


如 员工工资数据,只有财务部门可以看,人事部门是没有办法查看的。


一.二.三 逻辑数据独立性


可以屏蔽真实表的表结构信息。


如 查询真实表的话, select * from user, 那么用户就可以看到,这个表 user 里面有 id,name,sex,birthday,age,deptId 六个字段。


如将 :


select id,name from user ;


的查询结果封装成一个视图,如视图 v_user 的话, 那么在查询 视图 v_user 时,只会显示 id,name 两个字段, 从而避免了真实表 user 的数据结构。


如将


select a.id as uId,a.name as uName,d.id as dId,d.name as dName from user a
left join dept d on a.deptId=d.id;


的查询结果封装成一个视图, 如视图 v_user_dept 的话, 那么在查询 视图 v_user_dept 时,只会显示 员工编号,员工名称 ,部门编号,部门名称 四个字段, 从而屏蔽了真实 user 表和 真实 dept 表中的字段。


一.三 视图的操作


视图,通常有以下几种操作


操作

代码

创建视图  create view 视图名 as sql查询
查看视图

describe 视图名 或者 show create view 视图名

修改视图 create or replace view 视图 as sql查询
使用视图 正常表 table 的使用
删除视图 drop view [if exists] 视图名
视图条件限制 with check option


下面,老蝴蝶 分别对每一种操作进行讲解。


视图,仍然使用的是 user 表和 dept 表进行讲解。


use yuejl;
  select * from user;
  select * from dept;


20200401161943521.png


二. 创建视图 create view view_name


二.一 创建的命令


创建视图的完整命令是:


create [or replace] [algorithm={undefined|megre|temptable}]
  view view_name [{column_list}]
  as select_statement
  [with {cascaded|local} check option]


通常,会简写成:


create [or replace]
  view view_name [{column_list}]
  as select_statement


create 表示创建, or replace 表示 替换。 连用的话, create or replace 表示,如果存在这个视图名,就替换,

如果不存在,就创建。


其中,{column_list} 常常会省略,省略时,表示 视图中的字段名称 与 select_statement 中的字段名称一致。


其中,创建视图,可以在单表上,也可以在多表上。


二.二 单个表省略字段创建视图


如,查询员工的id,name,age 和 id和age的积 的值。


查询语句为:


select id,name,age,id*age from user;


20200401161952690.png


那么, 创建 单表视图, 如 v_user1 就是:


create view v_user1
as select id,name,age,id*age from user;


20200401161959806.png


查询 视图 v_user1, 就像查询表 那么操作


select * from v_user1;


20200401162005261.png


其中, 视图的字段列表,就是查询的语句的字段列表。


二.三 单个表重新定义字段 创建视图


将视图的字段列表,重新定义, 不用原先的 查询表中的字段, 需要用到 [{column_list}]


create view v_user2 (nId,nName,nAge,nIdAge)
  as select id,name,age,id*age from user;


20200401162011943.png


再次查询时:


select * from v_user2;


20200401162016675.png


发现,视图字段就变成了新定义的字段列表了。


二.四 多个表创建视图


如,查询每个员工的编号,姓名,部门编号和部门的名称。


查询语句为:


select a.id as uId,a.name as uName,d.id as dId,d.name as dName from user a
left join dept d on a.deptId=d.id;


20200401162022976.png


创建视图 v_user_dept


create view v_user_dept (uId,uName,dId,dName)
  as (select a.id as uId,a.name as uName,d.id as dId,d.name as dName from user a 
  left join dept d on a.deptId=d.id) ;


2020040116203042.png


查询视图


select * from v_user_dept;


20200401162035696.png


会发现, 视图的查询,远比表连接查询,更简单,也更易复用。


三. 查看视图


如何像查看 表结构 那样, 查看视图结构呢?


三.一 describe view_name


如 查询刚才创建的 v_user1 视图


describe v_user1;


20200401162042501.png


与 describe 表名 查询出来的结构一致。


其中,也可以用其简写的形式, desc view_name


desc v_user1;


2020040116204881.png


三.二 show create view view_name


如 查询刚才创建的 v_user2 视图


show create view v_user2 \G


20200401162054100.png


与 show create table table_name 一致。


三.三 show table status like ‘视图名’


查看 视图结构的详细信息


如 查看 视图 v_user1


show table status like 'v_user1' \G


20200401162101384.png


comment 为 view 表示,是视图


如果是表的话, comment 显示的是 空字符串


show table status like 'user' \G


20200401162123167.png


三.四 information_schema 数据库下的 views 表


如 查询一下 v_user1 视图


select * from information_schema.views t where t.table_name='v_user1' \G


20200401162138639.png


information_schema.views, 表示去查询 information_schema 数据库下的 views 表(注意,此时仍然在 yuejl数据库中)


一般 使用 describe(desc) 视图名 进行查询视图的相关信息。


20200401162138639.png20200401162138639.png20200401162138639.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
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 数据库表上建立视图。视图可以建立在一张表中,也可以建立在多张表中。
68 1
|
5月前
|
缓存 DataWorks 关系型数据库
DataWorks产品使用合集之如何抽取MySQL视图数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
98 4
|
4月前
|
存储 数据可视化 关系型数据库
深入理解 MySQL 视图
深入理解 MySQL 视图
41 2
|
5月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)