DBMS - SQL 中的视图
SQL 中的视图就像虚拟表,它们本身不存储数据,而是充当可重用的保存的 SQL 查询。我们可以将视图视为查询结果的快照。视图为我们提供了一种简化的方式来查看或交互数据。
视图在提高查询可读性方面非常有用。它们还可以用于限制对敏感数据的访问,或将多个表的数据组合成单个视图。在本章中,我们将使用一系列示例来演示视图是什么、它们的类型,以及如何在实际应用中有效使用它们。
什么是 SQL 视图?
视图是存储在数据库中的预定义 SQL 查询。它像一个虚拟表一样工作,每当底层数据发生变化时都会自动更新。我们可以使用视图来 −
- 简化复杂查询
- 为不同用户创建定制化的视图
- 限制对特定列或行的访问
示例表和数据
在本章的示例中,我们将使用以下一组表来演示在 SQL 中使用视图的实际应用 −
以下是Customers 表 −
| customer_id | first_name | last_name | phone | |
|---|---|---|---|---|
| 1 | Antara | Joshi | antara.j@example.com | 123-456-7890 |
| 2 | Bimal | Saha | bimal.saha@example.com | 234-567-8901 |
| 3 | Chandan | Tudu | chandan.tudu@example.com | 345-678-9012 |
这是Products 表 −
| product_id | product_name | category | price | stock_quantity |
|---|---|---|---|---|
| 101 | Laptop | Electronics | 1000.00 | 10 |
| 102 | Smartphone | Electronics | 800.00 | 20 |
| 103 | Office Chair | Furniture | 150.00 | 5 |
而Orders 表如下 −
| order_id | customer_id | product_id | quantity | order_date |
|---|---|---|---|---|
| 1 | 1 | 101 | 1 | 2023-11-01 10:00:00 |
| 2 | 2 | 103 | 2 | 2023-11-02 12:30:00 |
| 3 | 3 | 102 | 1 | 2023-11-03 15:45:00 |
| 4 | 1 | 103 | 1 | 2023-11-04 14:00:00 |
在 SQL 中创建视图
要使用视图,我们必须了解如何从现有表创建视图。我们可以使用 CREATE VIEW 语句来创建视图。创建视图后,我们可以像查询表一样查询它。
示例:客户订单视图
让我们创建一个视图来显示客户姓名以及他们订购的产品。
CREATE VIEW CustomerOrders AS SELECT c.first_name, c.last_name, p.product_name, o.quantity, o.order_date FROM Orders o JOIN Customers c ON o.customer_id = c.customer_id JOIN Products p ON o.product_id = p.product_id;
使用以下查询从CustomerOrders视图中获取所有记录 −
SELECT * FROM CustomerOrders;
它将从视图中获取所有记录 −
| first_name | last_name | product_name | quantity | order_date |
|---|---|---|---|---|
| Antara | Joshi | Laptop | 1 | 2023-11-01 10:00:00 |
| Bimal | Saha | Office Chair | 2 | 2023-11-02 12:30:00 |
| Chandan | Tudu | Smartphone | 1 | 2023-11-03 15:45:00 |
| Antara | Joshi | Office Chair | 1 | 2023-11-04 14:00:00 |
这个视图组合了三个表的数据,使得获取客户订单更加容易。
使用视图更新数据
某些视图允许更新,但这取决于视图的复杂性和数据库约束。
示例:通过简单视图更新
让我们创建一个视图来显示产品库存水平。
CREATE VIEW ProductStock AS SELECT product_id, product_name, stock_quantity FROM Products;
使用以下查询从 ProductStock 视图中获取详细信息 −
SELECT * FROM ProductStock;
它将从 ProductStock 视图中获取记录 −
| product_id | product_name | stock_quantity |
|---|---|---|
| 101 | Laptop | 10 |
| 102 | Smartphone | 20 |
| 103 | Office Chair | 5 |
通过视图更新库存数量
现在使用以下查询更新 ProductStock 视图 −
UPDATE ProductStock SET stock_quantity = stock_quantity - 1 WHERE product_id = 101;
再次查询 ProductStock 视图 −
SELECT * FROM ProductStock;
它将从 ProductStock 视图中获取更新后的数据 −
| product_id | product_name | stock_quantity |
|---|---|---|
| 101 | Laptop | 9 |
| 102 | Smartphone | 20 |
| 103 | Office Chair | 5 |
在这里,我们可以看到更新也反映在底层的 Products 表中。
SQL 中的视图类型
SQL 视图可以分为两种主要类型 −
- 简单视图
- 复杂视图
让我们从简单视图的简单示例开始。
简单视图
简单视图基于单个表。如果不使用计算或聚合函数,简单视图允许数据更新。
示例:客户的简单视图
在此查询中,我们从 Customers 表创建一个简单视图 −
CREATE VIEW CustomerDetails AS SELECT first_name, last_name, email FROM Customers;
复杂视图
复杂视图组合多个表的数据或包含计算。它们也可以是聚合函数或 GROUP BY 子句。复杂视图通常不允许更新。
示例:总收入的复杂视图
让我们创建一个视图来计算每个产品的总收入 −
CREATE VIEW ProductRevenue AS SELECT p.product_name, SUM(o.quantity * p.price) AS total_revenue FROM Orders o JOIN Products p ON o.product_id = p.product_id GROUP BY p.product_name;
使用以下查询从 ProductRevenue 视图中获取数据 −
SELECT * FROM ProductRevenue;
这个复杂视图获取每个产品生成的收入 −
| product_name | total_revenue |
|---|---|
| Laptop | 1000.00 |
| Smartphone | 800.00 |
| Office Chair | 450.00 |
删除视图
就像我们删除表一样,我们也可以删除视图。如果不再需要视图,可以使用 DROP VIEW 语句删除它。
示例:删除视图
使用以下查询删除 ProductStock 视图 −
DROP VIEW ProductStock;
它会删除 ProductStock 视图,但不会影响底层的 Products 表。
使用视图的优缺点
下表突出了在 SQL 查询中使用 视图 的优缺点 −
| 优点 | 缺点 |
|---|---|
|
简化复杂查询 − 我们可以将复杂的查询保存为视图并轻松重用。 限制数据访问 − 视图可以限制某些用户可以看到的列或行。 促进可重用性 − 一旦创建视图,它可以用于多个查询。 提高可读性 − 引用视图的查询通常更容易阅读和理解。 |
性能开销 − 复杂视图可能会降低性能,因为每次访问视图时都会执行查询。 更新受限 − 并非所有视图都允许数据更新。 依赖问题 − 删除或修改底层表可能会破坏视图。 |
结论
SQL 中的 Views 有助于简化查询并使数据管理更加容易。在本章中,我们详细介绍了如何在 SQL 中使用 views。我们了解了如何创建简单和复杂的 views、如何从 views 中查询数据,甚至如何通过 views 更新数据。使用 views,我们可以提高 SQL 查询的可读性,并应用安全性和可重用性功能。