=========== SELECT INTO =========== .. container:: refentry :name: SQL-SELECTINTO .. container:: titlepage .. container:: refnamediv .. rubric:: SELECT INTO :name: select-into SELECT INTO — 从一个查询的结果定义一个新表 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis [ WITH [ RECURSIVE ] with_query [, ...] ] SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ [ AS ] output_name ] [, ...] INTO [ TEMPORARY | TEMP | UNLOGGED ] [ TABLE ] new_table [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY expression [, ...] ] [ HAVING condition [, ...] ] [ WINDOW window_name AS ( window_definition ) [, ...] ] [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ] [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ] [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ] [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ] .. container:: refsect1 :name: id-1.9.3.172.5 .. rubric:: 描述 :name: 描述 ``SELECT INTO``\ 创建一个新表并且用一个查询 计算得到的数据填充它。这些数据不会像普通的 ``SELECT``\ 那样被返回给客户端。新表的列具有 和\ ``SELECT``\ 的输出列相关的名称和数据类型。 .. container:: refsect1 :name: id-1.9.3.172.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist ``TEMPORARY`` or ``TEMP`` 如果被指定,该表被创建为一个临时表。详见 `CREATE TABLE `__\ 。 ``UNLOGGED`` 如果被指定,该表被创建为一个不做日志的表。详见 `CREATE TABLE `__\ 。 *``new_table``* 要创建的表的名字(可以是模式限定的)。 所有其他参数在\ `SELECT `__\ 中有详细描述。 .. container:: refsect1 :name: id-1.9.3.172.7 .. rubric:: 注解 :name: 注解 `CREATE TABLE AS `__\ 在功能上与 ``SELECT INTO``\ 相似。\ ``CREATE TABLE AS`` 是被推荐的语法,因为这种形式的\ ``SELECT INTO``\ 在ECPG 或PL/pgSQL中不可用,因为它们对 ``INTO``\ 子句的解释不同。此外, ``CREATE TABLE AS``\ 提供的功能是 ``SELECT INTO``\ 的超集。 与\ ``CREATE TABLE AS``\ 相比,\ ``SELECT INTO`` 不允许指定属性,就像带有\ ```USING method`` `__\ 的表访问方法或者带有\ ```TABLESPACE tablespace_name`` `__\ 的表的表空间。 如果必要,使用\ `CREATE TABLE AS `__\ 。因此,为新表选择默认表访问方法。详细信息请参阅\ `default_table_access_method `__\ 。 .. container:: refsect1 :name: id-1.9.3.172.8 .. rubric:: 示例 :name: 示例 创建一个只由来自\ ``films``\ 的最近项构成的 新表\ ``films_recent``\ : .. code:: programlisting SELECT * INTO films_recent FROM films WHERE date_prod >= '2002-01-01'; .. container:: refsect1 :name: id-1.9.3.172.9 .. rubric:: 兼容性 :name: 兼容性 SQL 标准使用\ ``SELECT INTO``\ 表示把值选择 到一个宿主程序的标量变量中,而不是创建一个新表。这实际上就是 ECPG(见\ `章 `__\ )和 PL/pgSQL(见\ `章 `__\ ) 中的用法。 PostgreSQL使用 ``SELECT INTO``\ 的来表示表创建是有历史原因的。 最好在新代码中使用\ ``CREATE TABLE AS``\ 。 .. container:: refsect1 :name: id-1.9.3.172.10 .. rubric:: 另见 :name: 另见 `CREATE TABLE AS `__