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 AS는 SELECT INTO와 기능적으로 비슷해요. CREATE TABLE AS가 권장되는 구문인데, 이 형태의 SELECT INTO는 ECPG나 PL/pgSQL에서 INTO 절을 다르게 해석하기 때문에 사용할 수 없기 때문이에요. 게다가 CREATE TABLE AS는 SELECT INTO가 제공하는 기능의 상위 집합(superset)을 제공해요.
CREATE TABLE AS와 달리 SELECT INTO는 USING 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를 쓰는 것이 가장 좋아요.