Skip to content

视图是虚拟的表,只包含使用时动态检索数据的查询。视图本身不包含数据,返回的数据是从其他表中检索出来的。

为什么用视图?
  • 重用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