视图是虚拟的表,只包含使用时动态检索数据的查询。视图本身不包含数据,返回的数据是从其他表中检索出来的。
为什么用视图?
- 重用SQL语句
- 简化复杂SQL操作。在编写查询后,可以方便的重用它而不必知道基本查询细节
- 使用表的一部份而不是整个表
- 保护数据。可以授予用户访问表的特定部分的权限,而不是整个表的访问权限
- 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据
视图的规则
- 视图命名需唯一
- 可以创建的视图数目没有限制
- 创建视图,必须要有足够的访问权限
- 视图可以嵌套(嵌套视图性能下降严重)
- 许多DBMS禁止在视图中使用ORDER BY
- 有些DBMS要求对返回的所有列进行命名
- 视图不能索引,也不能有关联的触发器或默认值
- 有些DBMS把视图作为只读的查询,只能从视图检索数据,不能写入底层表
-- Active: 1739250781633@@127.0.0.1@3090@my_shop
# 创建视图
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;
SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01'
# 删除视图
DROP VIEW viewname;
# 视图格式化检索的数据
CREATE VIEW VendorLocations AS
SELECT CONCAT(vend_name, '(', vend_country, ')') AS vend_title
FROM Vendors;
# 视图过滤数据
# 过滤没有电子邮件地址的顾客
CREATE VIEW CustomerEMailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL;
# 结合计算字段
CREATE VIEW OrderItemsExpanded AS
SELECT order_num,
prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems;
##################挑战题######################
SELECT * FROM Orders;
# 1
CREATE VIEW CustomersWithOrders AS
SELECT Customers.*
FROM Customers, Orders
WHERE Customers.cust_id = Orders.cust_id;
# 2