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 테이블의 모든 열을 선택하되, city를 lower(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 함수는 중첩된 타입을 일반적인 스칼라 타입으로 변환해, 다루기 더 쉽게 만들어 줍니다.