摘抄:MySQL必知必会
视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
为什么使用视图?
- 重用SQL语句
- 简化复杂的SQL查询,编写后可以重用,不必知道内部细节;
- 使用表的组成部分而不是整个表;
- 保护数据,可以给用户授予表的特定部分的访问权限而不是整个表的访问权限;
- 更改数据格式和表示,视图可以返回与底层表的表示和格式不同的数据。
- 视图创建之后,可以用与表相同的方式操作它,执行insert、select、排序等操作;
- 如果添加或者改变基础表的数据,视图会返回已经改变后的数据,视图本身并不存储数据,仅仅是用来查看基础表的一种措施。
- 每次使用视图,都必须处理查询执行时所需要的任一个检索。如果使用了多个联结和过滤创建了复杂的视图或者嵌套视图,性能可能会下降得厉害。
视图的规则和限制
- 视图必须唯一命名;
- 创建视图没有数量限制;
- 创建视图,必须有足够的权限;
- 视图可以嵌套;
- 视图可以使用Order by,如果从该视图中检索数据SELECT语句中使用了ORDER BY ,那么原视图中的ORDER BY 将被覆盖;
- 视图不能索引,也不能有关联的触发器和默认值;
- 视图可以和表一起使用。
使用视图
- CREATE VIEW
- SHOW CREATE VIEW viewname;可以查看创建视图的语句;
- DROP VIEW viewname; 可以删除视图
- CREATE OR REPLACE VIEW 更新视图,或者先DROP再CREATE
利用视图简化复杂的联结
CREATE VIEW productcustomers 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;
SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = 'TNT2';
使用视图重新格式化数据
SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title
FROM verdors
ORDER BY vend_name;
如果经常用这个格式的结果,不需要每次执行联结,创建一个视图,每次需要的时候使用它即可;
CREATE VIEW vendorlocations AS
SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title
FROM verdors
ORDER BY vend_name;
用视图过滤不想要的数据
CREATE VIEW customeremaillist AS
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email IS NOT NULL;
使用视图与计算字段
SELECT prod_id, quantity, item_price,
quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;
更新视图
通常视图是可以更新的,(可以使用insert、update、delete)。更新视图将改变基表。
并非所有的视图可以更新,基本上可以说,如果Mysql不能正确地确定被更新的基数据,则不允许更新(包括插入和删除)。实际上这意味着如果视图中有如下操作不能更新:
- 分组 group by 和 having
- 联结;
- 子查询;
- 并;
- 聚集函数;
- DISTINCT;
- 导出(计算)列
一般地,视图主要用于数据检索,而不用于更新。