史上最简单的 MySQL 教程(三十三)「视图(上)」

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

视图

视图view,是一种有结构(有行有列),但没有结果(结构中不真实存放数据)的虚拟表,虚拟表的结构来源不是自己定义的,而是从对应的基表(视图的数据来源)中产生的。

创建视图

首先,给出创建视图的基本语法,

  • 基本语法create view + 视图名 + as + select语句;

其中,select语句可以是普通查询,也可以是连接查询、联合查询、子查询等。

此外,视图根据数据的来源,可以分为单表视图和多表视图:

  • 单表视图:基表只有一个;
  • 多表视图:基表至少两个。

执行如下 SQL 语句,进行测试:

-- 单表视图
create view my_v1 as select * from student;
create view my_v2 as select * from class;

-- 多表视图
create view my_v3 as
select * from student as s left join class c 
on s.c_id = c.id;
1

如上图所示,在我们创建多表视图的时候,由于表studentclass中都含有id字段,因此导致出现错误“重复列名”。修改上述创建多表视图的 SQL 语句,继续进行测试:

-- 多表视图
create view my_v3 as
select s.*, c.grade, c.room from student as s left join class c 
on s.c_id = c.id;
2

如上图所示,当我们去掉表class中的id字段之后,成功创建多表视图。这是因为,当视图的基表有多张的时候,字段名不能重复。

查询视图

在这里,查询视图是指查看视图的结构,而不是查看视图的结果。

由于视图是一张虚拟表,因此表的所用查询语句,都适用于视图,例如:

  • desc + 视图名;
  • show tables + 视图名;
  • show create table + 视图名;

执行如下 SQL 语句,进行测试:

-- 查询视图
desc my_v1;
show create table my_v1;
3

虽然视图是虚拟表,但它和真正的表,至少在关键字上还是有区别的,因此在查询视图创建语句的时候,可以使用如下 SQL 语句:

-- 查询视图创建语句
show create view my_v1;
4

此外,视图一旦创建,系统就会在视图对应的数据库文件夹下创建一个对应的frm结构文件,以保证结构的完整性。

使用视图

在操作数据库表的过程中,使用视图,主要就是为了查询,因此将视图当做表一样查询即可。

在这里需要注意的是,虽然我们说视图是一个虚拟表,它不保存数据,但是它却可以获取数据。

执行如下 SQL 语句,进行测试:

-- 使用视图
select * from my_v1;
select * from my_v2;
select * from my_v3;
5

如上图所示,我们查询视图的结果和查询创建视图时as后面连接的select语句的结果完全相同。

因此,我们也可以认为:创建视图,就是给一条select语句起别名,或者说是封装select语句

修改视图

视图本身不可修改,但是视图的来源(select)语句是可以修改的。因此,修改视图,就是修改视图的来源(select)语句。

  • 基本语法alter view + 视图名 + as + 新的select语句;

执行如下 SQL 语句,进行测试:

-- 修改视图
alter view my_v1 as
select id, name, gender, age, c_id from student;
6

删除视图

与视图的其他操作相比,删除视图比较简单,

  • 基本语法drop view + 视图名;

执行如下 SQL 语句,进行测试:

-- 删除视图
drop table my_v4;

-- 删除视图
drop view my_v4;
6

如上图所示,我们不能用

  • drop table + 视图名;

来删除视图,因为table包含真实的数据,而view说到底就是封装的select语句,并不包含真实的数据。虽然删除视图并不会影响数据,但在实际工作中,建议还是不要乱删别人建立的视图,因为视图封装的select语句很有可能包含复杂的业务逻辑。

视图意义

  • 视图可以节省 SQL 语句,将一条复杂的查询语句用视图来进行封装,以后可以直接对视图进行操作;
  • 数据安全,视图操作主要是针对查询的,如果对视图结构进行处理,例如删除,并不会影响基表的数据;
  • 视图往往在大型项目中使用,而且是多系统使用,可以对外提供有用的数据,但是隐藏关键(或无用)的数据;
  • 视图是对外提供友好型的,不同的视图提供不同的数据,就如专门对外设计的一样;
  • 视图可以更好(或者说,容易)的进行权限控制。

温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

众所周知,binlog日志对于mysql数据库来说是十分重要的。在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlo...

3278
来自专栏维C果糖

史上最简单的 MySQL 教程(十六)「列属性 之 唯一键」

唯一键:每张表往往有多个字段需要具有唯一性,数据不能重复,但是在每张表中,只能有一个主键,因此唯一键就是用来解决表中多个字段需要具有唯一性的问题。

3335
来自专栏Python爬虫实战

MySQL从零开始:03 基本入门语句

在上一小节中介绍了 MySQL 数据库的安装,接下来终于可以动手操作数据库了。本节内容介绍 MySQL 数据库的一些基本操作当做开胃菜。

741
来自专栏抠抠空间

MySQL之库操作

一、库的简介 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等 per...

2745
来自专栏程序猿

SQL注入分析服务器类型

分析数据库服务器类型 一般来说,ACCESS与SQL-SERVER是最常用的数据库服务器,尽管它们都支持T-SQL标准,但还有不同之处,而且不同的数据库有不同的...

3046
来自专栏Java架构沉思录

听说你还不会看MySQL慢查询日志?

MySQL中的日志包括:错误日志、二进制日志、通用查询日志、慢查询日志等等。这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志。

831
来自专栏博客园迁移

几种事务的隔离级别,InnoDB如何实现?

隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离。

591
来自专栏维C果糖

史上最简单的 MySQL 教程(二十二)「数据的高级操作 之 更新 & 删除」

此外,在删除记录的过程中,如果表中存在自增长的主键,那么删除之后,自增长不会还原。执行如下 SQL 语句,进行测试:

3478
来自专栏全华班

数据库事务理解

事物 本章讲述了三种常见的数据操作语句Insert /Update / Delete的基本语法,也提到了Oracle9i新的数据操作语句 – Merge的作用和...

2975
来自专栏源哥的专栏

如何对表操作进行监控

我们在跟踪定位一些系统问题的时候,经常需要知道哪些地方对一个表进行了操作,查询代码很麻烦,其实有一个简单的方法,就是跟踪表, 如下语句,就可以给表t_table...

1022

扫码关注云+社区