1 使用视图(VIEW)
1.1 视图
视图是虚拟的表,只包含使用时动态检索数据的查询。
视图的常见应用:
重用SQL语句。
简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道其基本查询细节。
使用表的一部分而不是整个表。
保护数据。可以授予用户访问表的特定部分的权限,而不是整个表的访问权限。
更改数据格式和提示。视图可返回与底层表的表示和格式不同的数据。
创建视图之后,可以用与表基本相同的方式使用它们。可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至添加和更新数据。
创建和使用视图的一些常见规则和限制:
与表一样,视图必须唯一命名,不能给视图取与别的视图或表相同的名字。
对于可以创建的视图数目没有限制。
创建视图,必须有足够的访问权限。
视图可以嵌套,可以利用从其他视图中检索数据的查询来构造视图。
视图不能索引,也不能有关联的触发器或默认值。
有些DBMS把视图作为只读的查询,这表示可以从视图检索数据,但不能将数据写回底层表。
1.2 创建视图CREATE VIEW
视图是虚拟的表,只包含使用时动态检索数据的查询。
视图用CREATE VIEW语句来创建。
使用SHOW CREATE VIEW viewname;来查看创建视图的语句。
用DROP删除视图,其语法为DROP VIEW viewname;。
更新视图时,可先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW。如果要更新的视图不存在,则第2条更新语句会创建一个视图;如果要更新的视图存在,则第2条更新语句会替换原有视图。
1.2.1 利用视图简化复杂的联结
常见的视图应用是隐藏复杂的SQL。
(1)先创建ProductCustomers视图。
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;
(2)检索订购了产品RGAN01的顾客。
SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';
利用视图,可一次性编写基础的SQL,然后根据需要多次使用。
1.2.2 用视图重新格式化检索出的数据
将供应商Vendors表中的vend_name和vend_country合并输出显示。
CREATE VIEW VendorLocations AS
SELECT concat(RTRIM(vend_name), '(', RTRIM(vend_country), ')')
AS vend_title
FROM Vendors;
SELECT *
FROM VendorLocations;
1.2.3 用视图过滤不想要的数据
定义CustomerEmailList视图,过滤没有Email的顾客。
CREATE