写点什么

数据库的视图该怎么用?

作者:阿柠xn
  • 2022 年 9 月 15 日
    陕西
  • 本文字数:1624 字

    阅读完需:约 5 分钟

使用视图

视图

MySQL5 添加了对视图的支持。


视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。


我们用例子说话:


这是我们之前写的一个 SELECT 语句,使用的联结


SELECT cust_name , cust_contactFROM customers , orders, orderitemsWHERE customers.cust_id = orders.cust_id        AND orderitems.order_num = orders.order_num        AND prod_id = 'TNT2';
复制代码


此查询用来检索订购了某个特定产品的客户。所以你想查到这个数据,就需要对各个表特别熟悉。


现在,假如可以把整个查询包装成一个名为 productcustomers 的虚拟表。则可以轻松的检索出想要的数据,不是吗?


SELECT cust_name ,cust_contactFROM productcustomersWHERE prod_id = 'TNT2';
复制代码


这就是视图的作用,productcustomers 是一个视图,作为视图,它不包含表中应该有的任何列或数据,它包含的是一个 SQL 查询。

为什么使用视图?

视图的常见应用


  • 重用 SQL 语句

  • 简化复杂的 SQL 操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节

  • 使用表的组成部分而不是整个表

  • 保护数据。可以给用户授权表的特定部分的访问权限而不是整个表的访问权限

  • 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据


你要知道,视图仅仅是用来查看存储在别处的数据的一种设施。视图本身不包含数据,因此他们返回的数据是从其他表中检索出来的。

视图的规则和限制

下面是视图创建和使用的一些常见的规则与限制


  • 与表名一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)

  • 对于创建的视图数目没有限制

  • 为了创建视图,必须具有足够的访问权限。这些限制通常由数据库管理人员授予

  • 视图可以嵌套,既可以利用从其他视图中检索数据的查询来构造一个视图

  • ORDER BY 可以用在视图中,但如果从该视图检索数据的 SELECT 语句中也含有 ORDER BY ,那么该视图中的 ORDER BY 将被覆盖。

  • 视图不能索引,也不能有关联的触发器或默认值

  • 视图可以和表一起使用。你可以编写一条联结表和视图的 SELECT 语句。

视图创建

  • 视图用 CREATE VIEW 语句来创建。

  • 使用 SHOW CREATE VIEW viewname;来查看创建视图的语句

  • 用 DROP 删除视图,其语法为 DROP VIEW viewname

  • 更新视图时,可以先用 DROP 再用 CREATE,也可以直接 CREATE OR REPLACE VIEW

利用视图简化复杂的联结

​ 就是我们在本章一开始讲的那个例子,我们设置一个视图


SELECT VIEW productcustomers ASSELECT cust_name , cust_contactFROM customers , orders, orderitemsWHERE customers.cust_id = orders.cust_id        AND orderitems.order_num = orders.order_num;
复制代码


这条语句就是创建了一个名为 productcustomers 的视图,它联结三个表,返回已订购了任意产品的所有客户的列表

用视图重新格式化检索出的数据

SELECT Concat(vend_name,'(',vend_country,')') AS vend_titleFROM vendorsORDER BY vend_name;
复制代码


这是我们之前写过的一个计算字段。


我们可以把它转换为视图。


CREATE VIEW vendorlocation ASSELECT Concat(vend_name,'(',vend_country,')') AS vend_titleFROM vendorsORDER BY vend_name;
复制代码

用视图过滤不想要的数据

我们定义 customeremaillist 视图,它过滤没有电子邮件地址的客户。


CREATE VIEW customeremaillist ASSELECT cust_id , cust_name,cust_emailFROM customersWHERE cust_email IS NOT NULL
复制代码

使用视图与计算字段

视图对于简化计算字段的使用特别有用


SELECT prod_id,        quantity,        item_price,        quantity*item_price AS expanded_priceFROM orderitemsWHERE order_num = 20005;
复制代码


我们设置一个视图


CREATE VIEW orderitemsexpanded ASSELECT prod_id,        quantity,        item_price,        quantity*item_price AS expanded_priceFROM orderitems
复制代码


我们要是还想检索 20005 就可以这样写:


SELECT * FROM orderitemsexpandedWHERE order_num = 20005;
复制代码

更新视图

视图的更新限制比较多。涉及以下的都不能去直接更新视图


  • 分组

  • 联结

  • 子查询

  • 聚集函数

  • DISTINCT

  • 导出列


发布于: 刚刚阅读数: 4
用户头像

阿柠xn

关注

还未添加个人签名 2022.08.29 加入

还未添加个人简介

评论

发布
暂无评论
数据库的视图该怎么用?_MySQL_阿柠xn_InfoQ写作社区