视图
2019年8月14日大约 2 分钟约 685 字
1. 概念引入
MySQL 5 添加了对视图的支持。
视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
视图仅仅是用来查看存储在别处的数据的一种设施。
视图的一些常见应用:
- 重用 SQL 语句
- 简化复杂的 SQL 操作:在编写查询后,可以方便地重用它而不必知道它的基本查询细节。
- 使用表的组成部分而不是整个表。
- 保护数据:可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
- 更改数据格式和表示:视图可返回与底层表的表示和格式不同的数据。
视图可能导致性能下降。
2. 视图的一些规则
- 视图命名必须唯一,不能与表、其他视图的名字相同
- 对于可以创建的视图数目没有限制
- 视图可以嵌套
ORDER BY
可以用在视图中,但如果从该视图检索数据SELECT
中也含有ORDER BY
,则该视图中的ORDER BY
将被覆盖- 视图不能索引,也不能有关联的触发器或默认值
- 视图和表可以一起使用
3. 语法
语法 | 说明 |
---|---|
CREATE VIEW | 创建视图 |
SHOW CREATE VIEW viewname | 查看创建视图的语句 |
DROP VIEW viewname | 删除视图 |
CREATE OR REPLACE VIEW | 更新视图 |
4. 视图的应用
隐藏复杂的 SQL,简化复杂的联结:
CREATE VIEW productcustomers AS SELEECT cust_name, cust_contact, prod_id FROM customers, orders, orderitems WHERE customers, cust_id = orders.cust_id AND orderitems.order_num = orders.order_num;
重新格式化检索出的数据:
CREATE VIEW cusomeremaillist AS SELECT Concat(RTrime(vend_name), ' (', RTrim(vend_country), ')') AS vend_title FROM vendors ORDER BY vend_name;
应用于 WHERE 过滤不想要的数据:
CREATE VIEW customeremaillist AS SELECT cust_id, cust_name, cust_email FROM customers WHERE cust_email IS NOT NULL;
如果从视图检索数据时使用了一条
WHERE
子句,则两组子句(一组在视图中,一组是传递给视图的)将自动组合。简化字段的使用:
CREATE VIEW orderitemsexpanded AS SELECT order_num, prod_id, quantity, item_price, quantity*item_price AS expanded_price FROM orderitems;
5. 其他
视图是可更新的,即,可以对它们使用INSERT
、UPDATE
、DELETE
。
更新一个视图将更新其基表,即,如果你对视图增加或删除行,实际上是对其基表增加或删除行。
如果视图定义中有如下操作,则不能进行视图的更新(这些限制自 MySQL 5 以来是正确的,但未来很可能会取消某些限制)。
- 分组(使用
GROUP BY
和HAVING
); - 联结;
- 子查询;
- 并;
- 聚集函数(
Min(), Count(), Sum()
等); DISTINCT
;- 导出(计算)列。