九月 13, 2023
摘要:在本教程中,您将学习如何使用 PostgreSQL 的CREATE TABLE AS
语句从查询结果集创建新表。
目录
PostgreSQL CREATE TABLE 语句简介
CREATE TABLE AS
语句创建一个新表,并用查询返回的数据填充它。下面显示了CREATE TABLE AS
语句的语法:
CREATE TABLE new_table_name
AS query;
在这个语法中:
- 首先,在
CREATE TABLE
子句后指定新表名。 - 其次,在
AS
关键字之后提供一个查询,其结果集会被添加到新表中。
TEMPORARY
或TEMP
关键字允许您创建临时表:
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 语句示例
我们将使用示例数据库中的film
和film_category
表进行演示。
以下语句创建一个表,其中包含属于类别 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;
要检查action_film
表的结构,可以在psql
工具中使用以下命令:
\d action_film;
它返回以下输出:
正如输出中清楚显示的那样,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
以下是输出:
请注意,CREATE TABLE AS
语句与SELECT INTO
语句类似,但CREATE TABLE AS
语句是首选,因为它不会与 PL/pgSQL 中SELECT INTO
语法的用法相混淆。此外,CREATE TABLE AS
语句还提供了SELECT INTO
语句所提供功能的超集。
在本教程中,您学习了如何使用 PostgreSQL 的CREATE TABLE AS
语句根据查询结果创建新表。