管理 PostgreSQL 视图

在本教程中,您将了解视图以及如何在 PostgreSQL 中管理视图。

摘要:在本教程中,您将了解视图以及如何在 PostgreSQL 中管理视图。

视图是存储查询的数据库对象。视图可以作为 PostgreSQL 中的虚拟表访问。换句话说,PostgreSQL 视图是一个逻辑表,通过SELECT 语句表示一个或多个底层表的数据。请注意,除了物化视图之外,视图不会物理存储数据。

PostgreSQL 视图

视图在某些情况下非常有用,例如:

  • 视图有助于简化查询的复杂性,因为您可以使用简单 SELECT 语句查询基于复杂查询的视图。
  • 与表一样,您可以通过包含用户有权查看的特定数据的视图向用户授予权限。
  • 即使基础表的列发生变化,视图也能提供一致的层。

创建 PostgreSQL 视图

要创建视图,我们使用 CREATE VIEW 语句。最简单的 CREATE VIEW 语句语法如下:

CREATE VIEW view_name AS query;

首先,在 CREATE VIEW 子句后指定视图的名称,然后在 AS 关键字后放置查询。查询可以是简单的 SELECT 语句,也可以是 SELECT 带有连接的复杂语句。

PostgreSQL 创建视图示例

例如,在我们的 PostgreSQL Sakila 示例数据库中,我们有四个表:

  1. customer – 存储所有客户数据
  2. address – 客户的商店地址
  3. city – 存储城市数据
  4. country – 存储国家数据

posgresql 视图 - 表

如果你想得到一个完整的客户数据,你通常构造一个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);

查询结果如下图所示:

posgresql 视图 - 客户数据

这个查询相当复杂。但是,您可以创建一个名为 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;

posgresql 更改视图 - 客户大师

要更改视图的定义,请使用该 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 视图。