MySQL 之视图

视图

视图为虚拟的表,作为一种用来查看存储在别处的数据的机制,视图本身不包含数据,它们返回的数据是从其他表中检索出来的。可以这么说,视图提供了一种 MySQL 的 SELECT 语句层次的封装,可以用来简化数据处理以及重新格式化基础数据或保护基础数据。

使用数据库视图,有以下优点:

  • 重用 SQL 语句。
  • 简化复杂的 SQL 操作。创建视图之后可以方便地重用它而不必知道它的基本查询细节。
  • 使用表的组成部分而不是整个表。
  • 保护数据。可以给用户授权表的特定部分的访问权而不是整个表的访问权限。
  • 更改数据格式和表示。视图可以返回与底层表的表示和格式不同的数据。
  • 视图可以帮助我们兼容旧的系统。假设我们拥有一个数据中心,这个数据中心被很多的程序在使用。如果有一天我们决定重新设计这个数据中心以适应一些新的业务需求,可能需要删除一些旧的表,并且创建一些新的表,但是我们并不希望这些变动影响到那些老的程序。那么我们可以创建一些视图用来适配那些老的程序。

视图语法

1. 创建视图

CREATE 
     [ALGORITHM = {MERGE  | TEMPTABLE | UNDEFINED}]
VIEW [database_name].[view_name] 
AS
SELECT  statement

MySQL 有三种视图执行策略(ALGORITHM),分别是:

  • MERGE 策略:MySQL 会先将输入的查询语句和视图的声明语句进行合并,然后执行合并后的语句并返回。
  • TEMPTABLE 策略:MySQL 先基于视图的声明创建一张 emporary table,当输入查询语句时会直接查询这张 temporary table。由于需要创建 temporary table 来存储视图的结果集, TEMPTABLE 的效率要比 MERGE 策略低,另外使用 temporary table 策略的视图是无法更新的。
  • UNDEFINED 策略:如果创建视图的时候不指定策略,MySQL 默认使用此策略。UNDEFINED 策略会自动选择使用上述两种策略中的一个,优先选择 MERGE 策略,无法使用则转为 TEMPTABLE 策略。

2.更新视图

CREATE
     [OR REPLACE] [ALGORITHM = {MERGE  | TEMPTABLE | UNDEFINED}] 
VIEW view_name[(column_list)] 
AS
SELECT statement

3.查看视图

// 查看视图基本信息,如字段定义、字段数据类型、是否为空、是否为主外键、默认值和额外信息
DESCRIBE view_name;

// 查看视图的详细定义
SHOW CREATE VIEW view_name;

4.删除视图

DROP VIEW view_name;

视图应用

1. 利用视图简化复杂的联结

下面 SQL 语句创建了一个名为 product_customers 的视图,它联结三个表,以返回已订购了任意产品的所有客户的列表:

CREATE VIEW product_customers AS
SELECT cust_name, cust_contact, prod_id
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
    AND orderitems.order_num = orders.order_num;

现在,为了检索订购了产品 TNT2 的客户,可如下进行:

SELECT cust_name, cust_contact
FROM product_customers
WHERE prod_id = 'TNT2';

2. 利用视图格式化检索数据

假如,我们需要得到供应商名和位置作为一个列返回数据,可以创建这样一个视图:

CREATE VIEW vendor_locations AS 
SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title
FROM vendord
ORDER BY vend_name;

现在,为了检索出包含供应商名和位置的邮件标签的数据,可如下进行:

SELECT * FROM vendor_locations ;

3. 利用视图过滤数据

假如现在我们需要得到一个有电子邮件地址的用户列表,可以创建这样一个视图:

CREATE VIEW customer_email AS
SELECT cust_is, cust_name, cust_email
FROM customers
WHERE cust_email IS NOT NULL;

现在,在发送电子邮件到邮件列表是,我们可以如下进行:

SELECT * FROM customer_email;

PHP 学习总结
研读官网文档和网络优秀个人文章,对 PHP 编程相关作出学习总结。

Stay hungry, stay foolish.

846 声望
84 粉丝
0 条评论
推荐阅读
PHP 微服务集群搭建
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通。每个服务...

Jochen112阅读 14.2k评论 6

万字长文~vue+express+mysql带你彻底搞懂项目中的权限控制(附所有源码)
所谓的权限,其实指的就是:用户是否能看到,以及是否允许其对数据进行增删改查的操作,因为现在开发项目的主流方式是前后端分离,所以整个项目的权限是后端权限控制搭配前端权限控制共同实现的

水冗水孚11阅读 1.5k

花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

民工哥11阅读 1.1k

封面图
一次偶然机会发现的MySQL“负优化”
今天要讲的这件事和上述的两个sql有关,是数年前遇到的一个关于MySQL查询性能的问题。主要是最近刷到了一些关于MySQL查询性能的文章,大部分文章中讲到的都只是一些常见的索引失效场合,于是我回想起了当初被那个...

骑牛上青山8阅读 2.2k评论 2

2023最新MySQL高频面试题汇总
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬3阅读 978

Mysql索引覆盖
通常情况下,我们创建索引的时候只关注where条件,不过这只是索引优化的一个方向。优秀的索引设计应该纵观整个查询,而不仅仅是where条件部分,还应该关注查询所包含的列。索引确实是一种高效的查找数据方式,但...

京东云开发者2阅读 936

封面图
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go2阅读 407评论 1

封面图

Stay hungry, stay foolish.

846 声望
84 粉丝
宣传栏