PostgreSQL 教程: CREATE TABLE AS

九月 13, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的CREATE TABLE AS语句从查询结果集创建新表。

PostgreSQL CREATE TABLE 语句简介

CREATE TABLE AS语句创建一个新表,并用查询返回的数据填充它。下面显示了CREATE TABLE AS语句的语法:

CREATE TABLE new_table_name
AS query;

在这个语法中:

  1. 首先,在CREATE TABLE子句后指定新表名。
  2. 其次,在AS关键字之后提供一个查询,其结果集会被添加到新表中。

TEMPORARYTEMP关键字允许您创建临时表

CREATE TEMP TABLE new_table_name 
AS query; 

UNLOGGED关键字允许将新表创建为不记录日志的表:

CREATE UNLOGGED TABLE new_table_name
AS query;

新表的列将具有与SELECT子句的输出列相同的名称和数据类型。

如果您希望表列具有不同的名称,可以在新表名称后指定新表列:

CREATE TABLE new_table_name ( column_name_list)
AS query;

如果您想在创建新表时,避免表已存在的错误,可以使用IF NOT EXISTS选项,如下:

CREATE TABLE IF NOT EXISTS new_table_name
AS query;

PostgreSQL CREATE TABLE AS 语句示例

我们将使用示例数据库中的filmfilm_category表进行演示。

film_and_film_category_tables

以下语句创建一个表,其中包含属于类别 1 的动作片。

CREATE TABLE action_film AS
SELECT
    film_id,
    title,
    release_year,
    length,
    rating
FROM
    film
INNER JOIN film_category USING (film_id)
WHERE
    category_id = 1;

为了验证表的创建,可以从action_film表中查询数据:

SELECT * FROM action_film
ORDER BY title;

PostgreSQL CREATE TABLE AS data verification

要检查action_film表的结构,可以在psql工具中使用以下命令:

\d action_film;

它返回以下输出:

PostgreSQL CREATE TABLE AS example

正如输出中清楚显示的那样,action_film表的名称和数据类型源自SELECT子句的列。

如果SELECT子句包含表达式,则最好指定列的名称,例如:

CREATE TABLE IF NOT EXISTS film_rating (rating, film_count) 
AS 
SELECT
    rating,
    COUNT (film_id)
FROM
    film
GROUP BY
    rating;

此示例语句创建了一个新表film_rating并用film表中的摘要数据填充它。它显式指定新表的列名,而不是使用SELECT子句中的列名。

要检查film_rating表的结构,请在psql工具中使用以下命令:

\d film_rating

以下是输出:

PostgreSQL CREATE TABLE AS with explicit column names

请注意,CREATE TABLE AS语句与SELECT INTO语句类似,但CREATE TABLE AS语句是首选,因为它不会与 PL/pgSQLSELECT INTO语法的用法相混淆。此外,CREATE TABLE AS语句还提供了SELECT INTO语句所提供功能的超集。

在本教程中,您学习了如何使用 PostgreSQL 的CREATE TABLE AS语句根据查询结果创建新表。