重学MYSQL之使用视图

数据库 2020-09-10 1014

1.视图

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

说明:Access不支持视图,Mysql在版本5开始支持视图,SQLite仅支持只读视图。

例子:

SELECT cust_name, cust_contact FROM Customers, Orders, OrderItems WHERE Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Orders.order_num AND prod_id = 'RGAN01';

此查询用来检索订购了某种产品的顾客。任何需要这个数据的人都应理解相关表的结构,知道如何创建查询和对表进行联结。检索其他产品的相同数据,必须修改最后的WHERE子句。

现在,假如可以把整个查询包装成一个名为ProductCustomers的虚拟表,则可以如下轻松检索出相同的数据:

SELECT cust_name, cust_contact FROM ProductCustomers WHERE prod_id = 'RGAN01';

这就是视图的作用。ProductCustomers为一个视图,它不包含任何列或数据,包含的是一个查询

1.1 为什么使用视图

原因如下:

  • 重用SQL语句
  • 简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道其基本查询细节
  • 使用表的一部分而不是整个表
  • 保护数据。可以授权用户访问表的特定部分的权限,而不是整个表的访问权限
  • 更改数据格式和显示。视图可返回与底层表的表示和格式不同的数据。

创建视图后,可用与表基本相同 的方式使用它们。可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至添加和更新数据。

视图仅是用来查看存储在别处数据的一种设施。视图本身不包含数据,因此返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。

注意:如果你创建了复杂的视图或者嵌套视图,性能可能会下降得很厉害。因此,大量使用时,应该测试其性能。

1.2  视图的规则和限制

  • 与表一样,视图必须唯一命名,但是不可以取和表相同的名称
  • 对于可以创建的视图数目没有限制
  • 创建视图。必须具有足够的访问权限。这些权限通常由数据库管理人员授予。
  • 视图可嵌套,即可以利用从其他视图中检索数据的查询来构造视图。所允许嵌套层数在不同的数据库中有所不同(可能降低性能)。
  • 许多数据库禁止在视图查询中使用ORDER BY子句
  • 有些数据库要求对返回的所有列进行命名,如果列是计算字段,则需要使用别名。
  • 视图不能索引
  • 有些数据库把视图作为只读查询
  • 有些数据库允许创建这样的视图,它不能进行导致行不再属于视图的插入或更新。

2.创建视图

视图使用CREATE VIEW语句创建。

2.1 利用视图简化复杂的联结

一个最常见的视图应用是隐藏复杂的SQL,这通常涉及联结

CREATE VIEW ProductCustomers AS SELECT cust_name, cust_contact FROM Customers, Orders, OrderItems WHERE Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Orders.order_num

 这条语句创建了名为ProductCustomers的视图,它联结三个表。

检索订购了产品RGAN01的顾客

SELECT cust_name, cust_contact FROM ProductCustomers WHERE prod_id = 'RGAN01';

视图极大的简化了复杂SQL语句的使用。利用视图,可一次性编写基础SQL,然后根据需要多次使用。

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

对检索数据进行格式化

SELECT CONCAT(title,'(', banner_index, ')') AS new_title FROM blog_banner;

现在假设你经常使用这个格式的结果,你可以创建一个视图

CREATE VIEW CONCAT_BANNER AS SELECT CONCAT(title,'(', banner_index, ')') AS new_title FROM blog_banner;

使用

SELECT * FROM CONCAT_BANNER;

2.3 用视图过滤不想要的数据

CREATE VIEW GoodShop AS SELECT shop_price FROM goods_goods WHERE shop_price > 50;

获取价格大于50的商品

使用视图

SELECT * FROM GoodShop;

2.4 使用视图与计算字段

计算实际价格和原价的差价

SELECT market_price - shop_price AS PriceDifference FROM goods_goods WHERE id = 10;

使用视图后

CREATE VIEW PD AS SELECT market_price - shop_price AS PriceDifference FROM goods_goods;
SELECT * FROM PD WHERE id = 10;

其结果与上面直接使用SELECT相同。

标签:数据库

文章评论

评论列表

已有0条评论