SELECT 쿼리 (Query Syntax)

SELECT 쿼리 (Query Syntax)

SELECT 절은 쿼리가 반환할 열의 목록을 지정합니다. 절 안에서는 맨 앞에 나오지만, 논리적으로 이 자리의 표현식들은 마지막에야 실행돼요. SELECT 절에는 출력을 변환하는 임의의 표현식뿐 아니라 집계 함수와 창 함수도 담을 수 있습니다.

예시 (Examples)

tbl이라는 테이블에서 모든 열을 선택합니다:

SELECT * FROM tbl;

테이블의 열에 산술 연산을 적용하고 별칭(alias)을 붙입니다:

SELECT col1 + col2 AS res, sqrt(col1) AS root FROM tbl;

접두사 별칭(prefix alias)을 사용합니다:

SELECT
    res: col1 + col2,
    root: sqrt(col1)
FROM tbl;

addresses 테이블에서 중복 없이 모든 도시를 선택합니다:

SELECT DISTINCT city FROM addresses;

addresses 테이블의 전체 행 수를 반환합니다:

SELECT count(*) FROM addresses;

addresses 테이블에서 city 열만 제외한 모든 열을 선택합니다:

SELECT * EXCLUDE (city) FROM addresses;

addresses 테이블의 모든 열을 선택하되, citylower(city)로 바꿔 반환합니다:

SELECT * REPLACE (lower(city) AS city) FROM addresses;

주어진 정규식과 일치하는 모든 열을 테이블에서 선택합니다:

SELECT COLUMNS('number\\d+') FROM addresses;

테이블의 주어진 모든 열에 함수를 적용해 계산합니다:

SELECT min(COLUMNS(*)) FROM addresses;

공백이나 특수 문자를 가진 열을 선택하려면 큰따옴표(")를 사용합니다:

SELECT "Some Column Name" FROM tbl;

문법 (Syntax)

SELECT 목록 (SELECT List)

SELECT 절은 쿼리의 결과를 결정하는 표현식 목록을 담습니다. 선택 목록은 FROM 절의 어떤 열이든 참조할 수 있고, 표현식으로 이들을 결합할 수도 있어요. SQL 쿼리의 출력은 테이블이므로, SELECT 절의 모든 표현식 역시 이름을 갖습니다. 표현식은 AS 절을 사용해 명시적으로 이름을 붙일 수 있습니다(예: expr AS name). 사용자가 이름을 주지 않으면 시스템이 표현식 이름을 자동으로 붙입니다.

열 이름은 대소문자를 구분하지 않습니다. 자세한 내용은 대소문자 구분 규칙을 참고하세요.

별(Star) 표현식 (Star Expressions)

tbl이라는 테이블에서 모든 열을 선택합니다:

SELECT *
FROM tbl;

주어진 정규식과 일치하는 모든 열을 테이블에서 선택합니다:

SELECT COLUMNS('number\\d+')
FROM addresses;

별(star) 표현식FROM 절의 내용에 따라 여러 개의 표현식으로 확장되는 특별한 표현식입니다. 가장 단순한 경우, *FROM 절의 모든 표현식으로 확장됩니다. 열은 정규식이나 람다 함수를 사용해서도 선택할 수 있습니다. 자세한 내용은 star 표현식 페이지를 참고하세요.

DISTINCT 절 (DISTINCT Clause)

주소 테이블에서 중복 없이 모든 도시를 선택합니다:

SELECT DISTINCT city
FROM addresses;

DISTINCT 절은 결과에서 오직 고유한 행만 반환하는 데 사용합니다. 즉 중복 행은 모두 걸러집니다.

SELECT DISTINCT로 시작하는 쿼리는 중복 제거(deduplication)를 수행하는데, 이는 비용이 큰 연산입니다. 그러니 꼭 필요할 때만 DISTINCT를 사용하세요.

DISTINCT ON 절 (DISTINCT ON Clause)

각 나라에서 인구가 가장 많은 도시만 선택합니다:

SELECT DISTINCT ON(country) city, population
FROM cities
ORDER BY population DESC;

DISTINCT ON 절은 ON 절에 정의된 표현식 집합의 고유한 값마다 행 하나만 반환합니다. ORDER BY 절이 있으면 ORDER BY 기준에 따라 처음 만나는 행이 반환돼요. ORDER BY 절이 없으면 처음 만나는 행이 정의되지 않으므로 테이블의 어느 행이든 될 수 있습니다.

대규모 데이터셋을 쿼리할 때 모든 열에 DISTINCT를 쓰는 것은 비용이 클 수 있습니다. 따라서 결과에 충분한 수준의 고유성을 보장하는 열(또는 열 집합)에 DISTINCT ON을 쓰는 것을 고려해 보세요. 예를 들어 테이블의 키 열(들)에 DISTINCT ON을 쓰면 완전한 고유성이 보장됩니다.

집계 (Aggregates)

주소 테이블의 전체 행 수를 반환합니다:

SELECT count(*)
FROM addresses;

주소 테이블의 행을 도시별로 묶어 각 그룹의 전체 행 수를 반환합니다:

SELECT city, count(*)
FROM addresses
GROUP BY city;

집계 함수는 여러 행을 하나의 값으로 결합하는 특별한 함수입니다. SELECT 절에 집계 함수가 있으면 쿼리는 집계 쿼리(aggregate query)가 됩니다. 집계 쿼리에서는 모든 표현식이 집계 함수의 일부이거나, 그룹의 일부(GROUP BY로 지정된)여야 합니다.

창 함수 (Window Functions)

각 행에 증가하는 식별자를 담은 row_number 열을 생성합니다:

SELECT row_number() OVER ()
FROM sales;

시간 순서에 따라 현재 amount와 이전 amount의 차이를 계산합니다:

SELECT amount - lag(amount) OVER (ORDER BY time)
FROM sales;

창 함수는 결과에서 다른 행을 기준으로 값을 계산할 수 있게 해 주는 특별한 함수입니다. 창 함수는 *창 명세(window specification)*를 담은 OVER 절로 표시됩니다. 창 명세는 창 함수가 계산되는 프레임 또는 맥락을 정의합니다. 자세한 내용은 창 함수 페이지를 참고하세요.

unnest 함수 (unnest Function)

배열(array)을 한 단계 펼칩니다(unest):

SELECT unnest([1, 2, 3]);

구조체(struct)를 한 단계 펼칩니다:

SELECT unnest({'a': 42, 'b': 84});

unnest 함수는 배열, 목록, 또는 구조체와 함께 사용할 수 있는 특별한 함수입니다. unnest 함수는 타입에서 중첩(nesting)을 한 단계 제거합니다. 예를 들어 INTEGER[]INTEGER로 변환되고, STRUCT(a INTEGER, b INTEGER)a INTEGER, b INTEGER로 변환됩니다. unnest 함수는 중첩된 타입을 일반적인 스칼라 타입으로 변환해, 다루기 더 쉽게 만들어 줍니다.