Skip to content

视图

什么是视图?

视图是存储在数据库中的查询,它就像一个虚拟表,但不存储实际数据。视图基于 SQL 查询的结果集,每次访问视图时都会执行底层查询。

INFO

视图的本质视图本质上是一个命名查询,它允许我们像使用表一样使用复杂查询的结果。

为什么需要视图?

视图是数据库设计中非常重要的一部分,尤其适合简化复杂查询和保护数据

视图的主要优势:

  • 简化复杂查询
  • 提供数据抽象层
  • 限制对基础表的直接访问
  • 提供一致的数据接口

视图的创建语法

sql
CREATE VIEW 视图名称 AS
    SELECT 列1, 列2, ...
    FROM 表1, 表2, ...
    WHERE 条件;

实际示例

问题场景

假设我们有两个表:weather(存储天气记录)和cities(存储城市位置),我们经常需要查询这两个表的组合数据。

数据模型

sql
CREATE TABLE weather (
    city        varchar(80),
    temp_lo     int,           -- 最低温度
    temp_hi     int,           -- 最高温度
    prcp        real,          -- 降水量
    date        date
);
sql
CREATE TABLE cities (
    name        varchar(80),
    location    point          -- 城市坐标位置
);

示例数据

sql
INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
INSERT INTO weather VALUES ('San Francisco', 43, 57, 0.0, '1994-11-29');
INSERT INTO weather VALUES ('Hayward', 37, 54, 0.0, '1994-11-29');
sql
INSERT INTO cities VALUES ('San Francisco', '(-194.0, 53.0)');
INSERT INTO cities VALUES ('Hayward', '(-122.0, 37.0)');

创建视图

我们创建一个视图来组合这两个表的数据:

sql
CREATE VIEW city_weather AS
    SELECT name, temp_lo, temp_hi, prcp, date, location
    FROM weather, cities
    WHERE city = name;

使用视图

创建视图后,我们可以像查询普通表一样查询它:

sql
SELECT * FROM city_weather;

查询结果

    name    | temp_lo | temp_hi | prcp |    date    |    location
------------+---------+---------+------+------------+----------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27 | (-194.0,53.0)
 San Francisco |      43 |      57 |    0 | 1994-11-29 | (-194.0,53.0)
 Hayward       |      37 |      54 |    0 | 1994-11-29 | (-122.0,37.0)

视图的工作原理

视图的高级用法

视图还可以基于其他视图创建,形成多层视图结构

sql
-- 创建一个基于city_weather视图的新视图
CREATE VIEW sf_weather AS
    SELECT * FROM city_weather
    WHERE name = 'San Francisco';

持久化存储

视图的 SQL 定义被完整保存在 pg_views 系统视图中,数据库重启后,视图定义仍然存在。

sql
-- 查看视图定义在系统表中的存储
SELECT 
    schemaname,
    viewname,
    viewowner,
    definition
FROM pg_views 
WHERE viewname = 'tech_employees';

视图的修改和版本管理

视图的定义可以随时修改,修改后视图会自动更新。

sql
-- 修改视图定义
ALTER VIEW tech_employees AS
    SELECT * FROM employees
    WHERE department = 'Technology';

视图的最佳实践

视图使用建议

  • 使用视图封装复杂查询逻辑
  • 使用视图提供数据抽象层
  • 通过视图控制用户访问权限
  • 使用视图简化应用程序的数据访问代码

注意事项

  • 视图会在每次访问时执行查询,可能影响性能
  • 复杂视图可能导致查询优化器难以优化
  • 考虑使用物化视图(Materialized Views)来存储查询结果

小结

视图是 PostgreSQL 中非常实用的功能,它可以帮助开发者简化查询,提供数据抽象,并保持数据库接口的一致性。通过合理使用视图,我们可以构建出更加模块化、安全和易于维护的数据库应用。