SELECT INTO

SELECT INTO (SELECT INTO)

쿼리 결과로부터 새 테이블을 정의하는 명령이에요. 일반 SELECT가 쿼리 결과를 클라이언트에 돌려주는 것과 달리, SELECT INTO는 새 테이블을 만들어 그 테이블을 쿼리가 계산한 데이터로 채워요.

출처: PostgreSQL 문서

본문

개요 (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 ] [...] ]

설명 (Description)

SELECT INTO는 새 테이블을 만들고 쿼리가 계산한 데이터로 채워요. 일반 SELECT와 달리 데이터는 클라이언트로 반환되지 않아요. 새 테이블의 컬럼은 SELECT의 출력 컬럼과 연결된 이름과 데이터 타입을 가집니다.

파라미터 (Parameters)

  • TEMPORARY 또는 TEMP — 지정하면 테이블이 임시 테이블로 만들어져요. 자세한 내용은 CREATE TABLE을 참고하세요.
  • UNLOGGED — 지정하면 테이블이 unlogged(비로그) 테이블로 만들어져요. 자세한 내용은 CREATE TABLE을 참고하세요.
  • new_table — 만들 테이블의 이름으로, 스키마 한정(schema-qualified)으로 쓸 수도 있어요.

그 외 모든 파라미터는 SELECT에서 자세히 설명해요.

참고 (Notes)

CREATE TABLE ASSELECT INTO와 기능적으로 비슷해요. CREATE TABLE AS가 권장되는 구문인데, 이 형태의 SELECT INTO는 ECPG나 PL/pgSQL에서 INTO 절을 다르게 해석하기 때문에 사용할 수 없기 때문이에요. 게다가 CREATE TABLE ASSELECT INTO가 제공하는 기능의 상위 집합(superset)을 제공해요.

CREATE TABLE AS와 달리 SELECT INTOUSING method로 테이블의 접근 메서드를 지정하거나, TABLESPACE tablespace_name으로 테이블의 테이블스페이스를 지정하는 것 같은 속성을 허용하지 않아요. 필요하다면 CREATE TABLE AS를 사용하세요. 따라서 새 테이블에는 기본 테이블 접근 메서드가 선택됩니다. 자세한 내용은 default_table_access_method를 참고하세요.

예시 (Examples)

films 테이블에서 최근 항목만으로 새 테이블 films_recent를 만들려면:

SELECT * INTO films_recent FROM films WHERE date_prod >= '2002-01-01';

호환성 (Compatibility)

SQL 표준은 SELECT INTO를 새 테이블을 만드는 용도가 아니라, 호스트 프로그램의 스칼라 변수에 값을 선택하는 용도로 사용해요. 실제로 ECPG(Chapter 34)와 PL/pgSQL(Chapter 41)에서 그렇게 쓰입니다. 테이블 생성을 나타내는 PostgreSQL의 SELECT INTO 사용은 역사적인 것이에요. 일부 다른 SQL 구현도 이런 방식으로 SELECT INTO를 사용하지만(대부분은 CREATE TABLE AS를 지원해요), 이런 호환성 고려와 별개로 새 코드에서는 이 목적에 CREATE TABLE AS를 쓰는 것이 가장 좋아요.

더 알아보기 (Learn more)