mysql笔记(19)--使用视图

Posted HardyDragon_CC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql笔记(19)--使用视图相关的知识,希望对你有一定的参考价值。

什么是视图?

  • 它不包含表中应该有的任何列或数据,它包含的是一个SQL查询,貌似也叫作虚拟表。
  • 视图仅仅是用来查看存储在别处的数据的一种设施。视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。
  • 因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。视图影响性能。

为何要使用视图?

在这里插入图片描述
在视图创建之后,可以用与表基本相同的方式利用它们。可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至能添加和更新数据。

在这里插入图片描述

创建、操作视图

在这里插入图片描述

CREATE VIEW productcustomers AS 
SELECT cust_name ,cust_contact ,prod_id
FROM customers c ,orders o ,orderitems ot
WHERE c.cust_id = o.cust_id
	AND ot.order_num = o.order_num;

这条语句创建一个名为productcustomers的视图,它联结三个表,以返回已订购了任意产品的所有客户的列表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用视图查询数据:检索订购了产品TNT2的客户

  • 利用视图,可一次性编写基础的SQL,然后根据需要多次使用;例如这里的视图就相当于重复使用了联结
SELECT cust_name ,cust_contact 
FROM productcustomers p 
WHERE prod_id = 'TNT2';

在这里插入图片描述

也可以创建格式化的视图

CREATE VIEW vendorlocations AS 
SELECT concat(rtrim(vend_name),'(',rtrim(vend_country),')') AS vend_title
FROM vendors
ORDER BY vend_name;

在这里插入图片描述

使用视图查询格式化后的数据:

SELECT *
FROM vendorlocations v ;

在这里插入图片描述

原本的数据:
在这里插入图片描述

可以利用视图过滤数据:例如过滤没有电子邮件地址的客户

CREATE VIEW customeremaillist AS 
SELECT cust_id ,cust_name ,cust_email 
FROM customers c 
WHERE cust_email IS NOT NULL ;

在这里插入图片描述

当然也可以使用视图来计算字段:

CREATE VIEW orderitemsexpandes AS 
SELECT order_num ,
	   prod_id ,
	   quantity,
	   item_price,
	   quantity * item_price AS expanded_price
FROM orderitems o ;

在这里插入图片描述

之后特定查询计算字段就方便许多:

SELECT *
FROM orderitemsexpandes o 
WHERE order_num = 20005;

在这里插入图片描述

一般,应该将视图用于检索(SELECT语句)而不用于更新(INSERT、UPDATE和DELETE)。虽然可以但是有限制:当视图有以下操作时,不能更新视图。

视图本身没有数据,如果你对视图增加或删除行,实际上是对其基表增加或删除行。

在这里插入图片描述

总结:

视图为虚拟的表。它们包含的不是数据而是根据需要检索数据的查询
视图提供了一种mysql的SELECT语句层次的封装,可用来简化数据处理以及重新格式化基础数据或保护基础数据

创建视图:使用 CREATE VIEW 虚拟表名 AS 后接 select 查询语句
视图可以的操作和普通表的查询操作一样,区别在于视图为了方便复用sql语局,是一个封装,类似API,给人更方便调用来查询。

以上是关于mysql笔记(19)--使用视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将回收器视图添加到片段

如何在片段中填充列表视图?

需要一种有效的方法来避免使用 Laravel 5 重复代码片段

在片段中重新加载android视图

来自相机的 Android 丢失片段视图

从mysql的片段中加载ListView