从 01 开始 从 01 开始
首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • MySQL
  • Git
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 输入法
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 微信
  • 各大平台
  • RSS
  • Office
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry 想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • 三国杀
  • 关于本站
  • 关于我
  • 网站动态
  • 友人帐
  • 打赏
  • 如何搭建一个博客
  • 关于邮件服务器
  • 本站的分享资料
  • 年度总结

    • 2022 年度总结
    • 2023 年度总结
  • 文章分类
  • 文章标签
  • 文章归档

PeterJXL

首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • MySQL
  • Git
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 输入法
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 微信
  • 各大平台
  • RSS
  • Office
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry 想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • 三国杀
  • 关于本站
  • 关于我
  • 网站动态
  • 友人帐
  • 打赏
  • 如何搭建一个博客
  • 关于邮件服务器
  • 本站的分享资料
  • 年度总结

    • 2022 年度总结
    • 2023 年度总结
  • 文章分类
  • 文章标签
  • 文章归档
  • 计算机历史

  • 数字电路

  • 计算机组成原理

  • 操作系统

  • Linux

  • 计算机网络

  • Git

  • 计算机小知识

  • MySQL

    • 教程概述
    • 数据的存储
    • 数据库的安装
    • 数据库的启停与连接
    • 数据库的管理
    • SQL概述
    • 表的管理
    • seletct基础
    • 运算符
    • 聚合查询
    • 排序
    • 数据的插入
    • 数据的删除
    • 数据的更新
    • 事务
    • 视图
      • 视图是什么
      • 创建视图
      • 从视图中查询数据
      • 修改视图
      • 多重视图
      • 视图的缺点
      • 视图的限制
      • 删除视图
      • 查看视图的结构
    • 子查询
    • 函数
    • 谓词
    • CASE表达式
    • 集合运算
    • 联结-join
    • SQL入门小结
    • 更多数据库
    • MySQL的数据类型
    • 命令行的一些用法
    • 用户与权限管理
    • MySQL的权限管理
    • mysqldump
    • mysqladmin
    • Liquibase
    • 表注释与字段注释
    • 编码类型
  • 计算机基础
  • MySQL
2024-01-21
目录

视图

# 140.视图

视图(View),可以理解为是一个常用的SQL

‍

# 视图是什么

我们可以将频繁使用的select语句(例如月度统计、年度统计),保存为视图,这样就不用每次都重新书写并运行了。

特别是在进行汇总以及复杂的查询条件导致 SELECT 语句非常庞大时,使用视图可以大大提高效率。

‍

# 创建视图

创建视图需要使用 CREATE VIEW 语句 ,语法:

CREATE VIEW 视图名称(<视图列名1>, <视图列名2>, ……)
AS
<SELECT语句>
1
2
3

SELECT 语句需要书写在 AS 关键字之后。视图中列的排列顺序,和SELECT 语句中列的排列顺序相同。视图的列名在视图名称之后的列表中定义。

‍

‍

举例:我们将商品类型和数量做一个视图

create view ProductSum (product_type, cnt_product)
as 
select product_type, count(*)
from Product
group by product_type;
1
2
3
4
5

‍

# 从视图中查询数据

然后我们就可以使用视图了,我们可以将视图当成一个表:

select product_type, cnt_product
from ProductSum;


--结果:
+--------------+-------------+
| product_type | cnt_product |
+--------------+-------------+
| 衣服         |           2 |
| 办公用品     |           2 |
| 厨房用具     |           4 |
+--------------+-------------+
3 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13

‍

‍

视图和表的不同在于,视图并不会保存实际的数据。

我们在创建表时,会通过 INSERT 语句将数据保存到数据库之中,而数据库会将数据保存到磁盘上。在使用 SELECT 语句查询数据时,实际上就是从磁盘中读取数据,进行各种计算之后,再将结果返回给用户。

但是使用视图时并不会将数据保存到存储设备之中,而且也不会将数据保存到其他任何地方 。实际上视图保存的是 SELECT 语句。

‍

创建出视图之后,就可以通过非常简单的 SELECT 语句,随时得到想要的汇总结果。并且由于视图不保存数据,当Product 表中的数据更新之后,视图也会自动更新,非常灵活方便。

‍

‍

# 修改视图

‍

‍

# 多重视图

多重视图:以视图为基础创建的视图

00096

‍

举例:

create view ProductSumJim(product_type, cnt_product)
as 
select product_type, cnt_product
from ProductSum
where product_type='办公用品';
1
2
3
4
5

‍

‍

使用视图:

-- 确认创建好的视图
SELECT product_type, cnt_product
  FROM ProductSumJim;

--结果:
+--------------+-------------+
| product_type | cnt_product |
+--------------+-------------+
| 办公用品     |           2 |
+--------------+-------------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11

‍

‍

‍

# 视图的缺点

从视图中查询数据时,通常有如下两个步骤:

  1. 首先执行定义视图的 SELECT 语句
  2. 根据得到的结果,再执行在从视图查询数据的SQL

也就是说,使用视图的查询通常需要执行 2 条以上的 SELECT 语句(不同DBMS内部实现不同)。如果是多重视图,还会进一步降低SQL的性能。因此,应该避免在视图的基础上创建视图。

‍

‍

# 视图的限制

虽然之前我们说过在定义视图时可以使用任何 SELECT 语句,但ORDER BY 子句除外。为什么?这是因为视图和表一样,数据行都是没有顺序的。

有些 DBMS 在定义视图的语句中是可以使用 ORDER BY 子句的 (例如PostgreSQL),但这并不是通用的语法。因此,在定义视图时请不要使用 ORDER BY 子句。

‍

‍

此外,视图是无法随意更新的。虽然视图和表很像,几乎可以使用任何select语句;但本质上视图只是一个SQL,归根结底,视图的数据是从表中获取的,如果原表可以更新,那么视图中的数据也可以更新。反之亦然,如果视图发生了改变,而原表没有进行相应更新的话,就无法保证数据的一致性了。

就比如我们向视图 ProductSum 中添加数据 (' 电器制品 ',5) 时,原表 Product 应该如何更新才好呢?按理说应该向表中添加商品种类为“电器制品”的 5 行数据,但是这些商品对应的商品编号、商品名称和销售单价等我们都不清楚。数据库在这里就遇到了麻烦。

在某些特定条件下,视图也可以更新的,这里不推荐这么做,因此不展开。

‍

‍

‍

# 删除视图

删除视图需要使用 DROP VIEW 语句:

DROP VIEW 视图名称;
1

‍

注意多重视图的问题。如果视图B,是从视图A的基础上创建出来的,那么删除视图A就会出错。

如果要将B也删除,得使用级联关键字CASCADE:

DROP VIEW A CASCADE;
1

‍

‍

# 查看视图的结构

如何查看一个视图的结构呢(类似表结构)?也可以使用DESCRIBE(或简写为DESC):

DESCRIBE ProductSum;

--结果:
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| product_type | varchar(32) | NO   |     | NULL    |       |
| cnt_product  | bigint      | NO   |     | 0       |       |
+--------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10

‍

那查看视图的SQL呢?使用SHOW CREATE VIEW <视图名>;但是在命令行里查看的话很不美观,看起来不方便,可以用Navicat等工具查看

‍

‍

‍

‍

(完)

上次更新: 2024/5/30 15:25:05
事务
子查询

← 事务 子查询→

Theme by Vdoing | Copyright © 2022-2024 | 粤 ICP 备 2022067627 号-1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式