VALUES — 행 집합 계산

VALUES — 행 집합 계산

여러 행을 직접 나열해 하나의 "상수 테이블"을 만들고 싶을 때 쓰는 명령이에요. 큰 명령 안에 상수 데이터를 넣을 때 가장 흔히 쓰이며, 단독으로도 사용할 수 있어요.

출처: PostgreSQL 문서

본문

Synopsis

VALUES ( expression [, ...] ) [, ...]
    [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start [ ROW | ROWS ] ]
    [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]

설명 (Description)

VALUES는 값 표현식으로 지정된 행 값 또는 행 값들의 집합을 계산해요. 더 큰 명령 안에서 "상수 테이블(constant table)"을 생성하는 데 가장 흔히 사용되지만, 단독으로도 사용할 수 있어요.

둘 이상의 행이 지정되면 모든 행은 같은 수의 요소를 가져야 해요. 결과 테이블 컬럼의 데이터 타입은 UNION과 같은 규칙(10.5절 참고)을 사용해 해당 컬럼에 등장하는 표현식들의 명시적 또는 유추된 타입을 결합해 결정돼요.

더 큰 명령 안에서 VALUESSELECT가 허용되는 어디서든 문법적으로 허용돼요. 문법상 SELECT처럼 취급되기 때문에, VALUES 명령에 ORDER BY, LIMIT(또는 동등한 FETCH FIRST), OFFSET 절을 사용할 수 있어요.

매개변수 (Parameters)

expression

결과 테이블(행 집합)의 지정된 위치에 계산해 넣을 상수 또는 표현식이에요. INSERT의 최상위에 나타나는 VALUES 목록에서는 expressionDEFAULT로 대체해 대상 컬럼의 기본값을 삽입하도록 나타낼 수 있어요. DEFAULTVALUES가 다른 문맥에 나타날 때는 사용할 수 없어요. sort_expression

결과 행을 정렬하는 방법을 나타내는 표현식 또는 정수 상수예요. 이 표현식은 VALUES 결과의 컬럼을 column1, column2 등으로 참조할 수 있어요. 자세한 내용은 SELECT 문서의 ORDER BY 절을 참고하면 돼요. operator

정렬 연산자예요. 자세한 내용은 SELECT 문서의 ORDER BY 절을 참고하면 돼요. count

반환할 최대 행 수예요. 자세한 내용은 SELECT 문서의 LIMIT 절을 참고하면 돼요. start

행을 반환하기 시작하기 전에 건너뛸 행 수예요. 자세한 내용은 SELECT 문서의 LIMIT 절을 참고하면 돼요.

참고 (Notes)

매우 많은 수의 행을 가진 VALUES 목록은 사용하지 않는 게 좋아요. 메모리 부족 실패나 성능 저하가 발생할 수 있기 때문이에요. INSERT 안에 나타나는 VALUES는 특수한 경우로(원하는 컬럼 타입이 INSERT의 대상 테이블에서 알려져 있기 때문에 VALUES 목록을 스캔해 유추할 필요가 없음), 다른 문맥에서 실용적인 것보다 더 큰 목록을 처리할 수 있어요.

예시 (Examples)

순수한 VALUES 명령:

VALUES (1, 'one'), (2, 'two'), (3, 'three');

이것은 두 개의 컬럼과 세 개의 행을 가진 테이블을 반환해요. 다음 쿼리와 사실상 동일해요:

SELECT 1 AS column1, 'one' AS column2
UNION ALL
SELECT 2, 'two'
UNION ALL
SELECT 3, 'three';

더 일반적으로는 VALUES가 더 큰 SQL 명령 안에서 사용돼요. 가장 흔한 용도는 INSERT에서예요:

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

INSERT 문맥에서는 값 하나를 지정하는 대신 컬럼 기본값을 여기서 사용하라는 뜻으로 VALUES 목록의 항목이 DEFAULT일 수 있어요:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'),
    ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);

VALUES는 서브쿼리(sub-SELECT)를 쓸 수 있는 곳, 예를 들어 FROM 절에서도 사용할 수 있어요:

SELECT f.*
  FROM films f, (VALUES('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t (studio, kind)
  WHERE f.studio = t.studio AND f.kind = t.kind;

UPDATE employees SET salary = salary * v.increase
  FROM (VALUES(1, 200000, 1.2), (2, 400000, 1.4)) AS v (depno, target, increase)
  WHERE employees.depno = v.depno AND employees.sales >= v.target;

SELECT의 경우와 마찬가지로 VALUESFROM 절에서 사용할 때는 AS 절이 필요하다는 점을 유의해야 해요. AS 절이 모든 컬럼에 이름을 지정할 필요는 없지만, 그렇게 하는 것이 좋은 습관이에요. (VALUES의 기본 컬럼 이름은 PostgreSQL에서 column1, column2 등이지만, 다른 데이터베이스 시스템에서는 다를 수 있어요.)

VALUESINSERT에서 사용될 때 값들은 모두 해당 대상 컬럼의 데이터 타입으로 자동 변환돼요. 다른 문맥에서 사용될 때는 올바른 데이터 타입을 지정해야 할 수도 있어요. 항목이 모두 따옴표 붙은 리터럴 상수라면 첫 번째를 변환하는 것만으로 모두에 대해 가정된 타입을 결정하기에 충분해요:

SELECT * FROM machines
WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));

간단한 IN 검사에서는 위와 같은 VALUES 쿼리를 쓰는 것보다 IN의 스칼라 목록 형태에 의존하는 것이 더 좋아요. 스칼라 목록 방식은 작성할 게 더 적고 종종 더 효율적이에요.

호환성 (Compatibility)

VALUES는 SQL 표준을 준수해요. LIMITOFFSET은 PostgreSQL 확장이에요. SELECT 문서에서도 참고하면 돼요.

더 알아보기 (Learn more)

  • 여러 행을 한 번에 넣는 INSERT 명령에서 VALUES가 어떻게 쓰이는지 확인하면 돼요.
  • ORDER BY, LIMIT/FETCH, OFFSET 절은 SELECT 문서에서 더 자세히 볼 수 있어요.
  • 타입 결합 규칙은 10.5절을 참고하면 돼요.