管理 PostgreSQL 视图
在本教程中,您将了解视图以及如何在 PostgreSQL 中管理视图。
摘要:在本教程中,您将了解视图以及如何在 PostgreSQL 中管理视图。
视图是存储查询的数据库对象。视图可以作为 PostgreSQL 中的虚拟表访问。换句话说,PostgreSQL 视图是一个逻辑表,通过SELECT 语句表示一个或多个底层表的数据。请注意,除了物化视图之外,视图不会物理存储数据。

视图在某些情况下非常有用,例如:
- 视图有助于简化查询的复杂性,因为您可以使用简单
SELECT语句查询基于复杂查询的视图。 - 与表一样,您可以通过包含用户有权查看的特定数据的视图向用户授予权限。
- 即使基础表的列发生变化,视图也能提供一致的层。
创建 PostgreSQL 视图
要创建视图,我们使用 CREATE VIEW 语句。最简单的 CREATE VIEW 语句语法如下:
CREATE VIEW view_name AS query;
首先,在 CREATE VIEW 子句后指定视图的名称,然后在 AS 关键字后放置查询。查询可以是简单的 SELECT 语句,也可以是 SELECT 带有连接的复杂语句。
PostgreSQL 创建视图示例
例如,在我们的 PostgreSQL Sakila 示例数据库中,我们有四个表:
customer– 存储所有客户数据address– 客户的商店地址city– 存储城市数据country– 存储国家数据

如果你想得到一个完整的客户数据,你通常构造一个join语句如下:
SELECT cu.customer_id AS id,
cu.first_name || ' ' || cu.last_name AS name,
a.address,
a.postal_code AS "zip code",
a.phone,
city.city,
country.country,
CASE
WHEN cu.activebool THEN 'active'
ELSE ''
END AS notes,
cu.store_id AS sid
FROM customer cu
INNER JOIN address a USING (address_id)
INNER JOIN city USING (city_id)
INNER JOIN country USING (country_id);查询结果如下图所示:

这个查询相当复杂。但是,您可以创建一个名为 customer_master 如下的视图:
CREATE VIEW customer_master AS
SELECT cu.customer_id AS id,
cu.first_name || ' ' || cu.last_name AS name,
a.address,
a.postal_code AS "zip code",
a.phone,
city.city,
country.country,
CASE
WHEN cu.activebool THEN 'active'
ELSE ''
END AS notes,
cu.store_id AS sid
FROM customer cu
INNER JOIN address a USING (address_id)
INNER JOIN city USING (city_id)
INNER JOIN country USING (country_id);
从现在开始,每当您需要获取完整的客户数据时,只需执行以下简单 SELECT 语句从视图中查询即可:
SELECT
*
FROM
customer_master;
此查询产生的结果与上面带有连接的复杂查询相同。
更改 PostgreSQL 视图
要更改视图的定义查询,请使用 CREATE VIEW 带有 OR REPLACE 添加的语句,如下所示:
CREATE OR REPLACE view_name
AS
query
PostgreSQL 不支持删除视图中的现有列,至少到版本 9.4。如果您尝试这样做,您将收到一条错误消息:“[Err] 错误:无法从视图中删除列”。查询生成的列必须与创建视图时生成的列相同。更具体地说,新列必须与创建时具有相同的名称、相同的数据类型和相同的顺序。但是,PostgreSQL 允许您在列列表的末尾附加其他列。
例如,您可以 customer_master 按如下方式向视图添加电子邮件:
CREATE VIEW customer_master AS
SELECT cu.customer_id AS id,
cu.first_name || ' ' || cu.last_name AS name,
a.address,
a.postal_code AS "zip code",
a.phone,
city.city,
country.country,
CASE
WHEN cu.activebool THEN 'active'
ELSE ''
END AS notes,
cu.store_id AS sid,
cu.email
FROM customer cu
INNER JOIN address a USING (address_id)
INNER JOIN city USING (city_id)
INNER JOIN country USING (country_id);
现在,如果您从 customer_master 视图中选择数据,您将 email 在列表末尾看到该列。
SELECT
*
FROM
customer_master;

要更改视图的定义,请使用该 ALTER VIEW 语句。例如,您可以更改视图的名称 customer_master ,以 customer_info 通过使用下面的语句:
ALTER VIEW customer_master RENAME TO customer_info;
PostgreSQL 允许您为列名设置默认值、更改视图的架构、设置或重置视图的选项。有关更改视图定义的详细信息,请查看 PostgreSQL ALTER VIEW 语句。
删除 PostgreSQL 视图
要删除 PostgreSQL 中的现有视图,请使用 DROP VIEW 如下语句:
DROP VIEW [ IF EXISTS ] view_name;
您指定要删除 after DROP VIEW 子句的视图的名称。删除数据库中不存在的视图将导致错误。为了避免这种情况,您通常 IF EXISTS 在语句中添加选项以指示 PostgreSQL 删除该视图(如果它存在),否则,什么都不做。
例如,要删除 customer_info 您创建的视图,请执行以下查询:
DROP VIEW IF EXISTS customer_info;
该视图 customer_info 将从数据库中删除。
在本教程中,我们向您展示了如何创建、更改和删除 PostgreSQL 视图。