18.1 视图
视图是虚拟的表,本身不包含数据,也就不能对其进行索引操作。
对视图的操作和对普通表的操作一样。
视图具有如下好处:
- 简化复杂的 SQL 操作,比如复杂的连接;
- 只使用实际表的一部分数据;
- 通过只给用户访问视图的权限,保证数据的安全性;
- 更改数据格式和表示。
18.2 使用视图
- 视图用CREATE VIEW语句来创建。
- 使用SHOW CREATE VIEW viewname;来查看创建视图的语句。
- 用DROP删除视图,其语法为DROP VIEW viewname;
- 更新视图时,可以先用DROP再用CREATE,也可以直接用CREATE ORREPLACE VIEW。如果要更新的视图不存在,则第2条更新语句会创建一个视图;如果要更新的视图存在,则第2条更新语句会替换原有视图。
18.2.1 利用视图简化复杂的联结
看这样一个例子:
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;
这条语句创建一个名为productcustomers的视图, 它联结三个表,以返回已订购了任意产品的所有客户的列表。如果执行SELECT * FROM productcustomers,将列出订购了任意产品的客户。
为检索订购了产品TNT2的客户,可如下进行:
SELECT cust_name, cust_contact FROM productcustomers WHERE prod_id = ' TNT2';
利用视图,可一次性编写基础的SQL,然后根据需要多次使用。
18.2.2 用视图重新格式化检索出的数据
创建方式和上一小节类似,都是在开头使用 CREATE VIEW viewname AS
CREATE VIEW vendorlocations AS SELECT Contact(RTRIM(vend_name) '(' RTRIM(vend_country) ')')
AS vend_title
FROM vendors;
18.2.3 用视图过滤不想要的数据
CREATE VIEW customeremaillist AS
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email IS NOT NULL;
18.2.4 使用视图与计算字段
CREATE VIEW orderitemsexpanded AS SELECT order_num, prod_id, quantity, item_price, quantity * item_price AS expanded_price FROM orderitems;