SELECT 문

SELECT 문 (SELECT Statement)

데이터베이스에서 행을 가져오는 가장 기본적인 문이 바로 SELECT 문이에요. SELECT 문은 데이터베이스에서 행을 검색해요.

출처: DuckDB 공식 문서 — SELECT Statement

예제 (Examples)

tbl 테이블의 모든 열을 선택해요:

SELECT * FROM tbl;

tbl에서 행을 선택해요:

SELECT j FROM tbl WHERE i = 3;

i 열로 그룹화된 집계를 수행해요:

SELECT i, sum(j) FROM tbl GROUP BY i;

tbl에서 상위 3개 행만 선택해요:

SELECT * FROM tbl ORDER BY i DESC LIMIT 3;

USING 절을 사용해 두 테이블을 조인해요:

SELECT * FROM t1 JOIN t2 USING (a, b);

열 인덱스를 사용해 tbl 테이블에서 첫 번째와 세 번째 열을 선택해요:

SELECT #1, #3 FROM tbl;

addresses 테이블에서 모든 고유한 도시를 선택해요:

SELECT DISTINCT city FROM addresses;

행 변수를 사용해 STRUCT를 반환해요:

SELECT d
FROM (SELECT 1 AS a, 2 AS b) d;

문법 (Syntax)

SELECT 문은 데이터베이스에서 행을 검색해요. SELECT 문의 표준 순서는 다음과 같으며, 덜 일반적인 절은 들여쓰기로 표시돼요:

SELECT ⟨select_list⟩
FROM ⟨tables⟩
    USING SAMPLE ⟨sample_expression⟩
WHERE ⟨condition⟩
GROUP BY ⟨groups⟩
HAVING ⟨group_filter⟩
    WINDOW ⟨window_expression⟩
    QUALIFY ⟨qualify_filter⟩
ORDER BY ⟨order_expression⟩
LIMIT ⟨n⟩;

선택적으로 SELECT 문 앞에 WITH을 붙일 수 있어요.

SELECT 문이 매우 복잡하기 때문에 문법 다이어그램을 여러 부분으로 나누었어요. 전체 문법 다이어그램은 페이지 맨 아래에서 확인할 수 있어요.

SELECT

SELECT은 쿼리가 반환할 열 목록을 지정해요. 절의 맨 앞에 나타나지만, 논리적으로 여기의 표현식은 마지막에만 실행돼요. SELECT 절은 출력을 변환하는 임의의 표현식뿐만 아니라 집계 함수와 윈도우 함수도 포함할 수 있어요. DISTINCT 키워드는 고유한 튜플만 반환되도록 보장해요.

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

FROM

FROM은 나머지 쿼리가 작동할 데이터의 소스를 지정해요. 논리적으로, FROM 절이 쿼리가 실행을 시작하는 곳이에요. FROM 절은 단일 테이블, 함께 조인된 여러 테이블의 조합, 또는 서브쿼리 노드 안의 다른 SELECT 쿼리를 포함할 수 있어요.

SAMPLE

SAMPLE은 기본 테이블에서 표본을 뽑아 쿼리를 실행할 수 있게 해줘요. 이는 쿼리 처리를 크게 빠르게 할 수 있지만, 결과의 정확성이 희생될 수 있어요. 표본은 데이터셋을 탐색할 때 데이터의 스냅샷을 빠르게 확인하는 데도 사용될 수 있어요. SAMPLE 절은 FROM 절의 모든 것 직후에 적용돼요 (즉, 모든 조인 이후, 하지만 WHERE 절이나 집계 이전). 자세한 내용은 Samples 페이지를 참고하세요.

WHERE

WHERE은 데이터에 적용할 필터를 지정해요. 이렇게 하면 관심 있는 데이터의 부분집합만 선택할 수 있어요. 논리적으로 WHERE 절은 FROM 절 직후에 적용돼요.

GROUP BYHAVING

GROUP BYSELECT 절의 집계를 수행하는 데 사용할 그룹핑 열을 지정해요. GROUP BY 절이 지정되면, SELECT 절에 집계가 없더라도 쿼리는 항상 집계 쿼리가 돼요.

WINDOW

WINDOW은 윈도우 함수 안에서 사용할 수 있는 이름 있는 윈도우를 지정할 수 있게 해줘요. 여러 윈도우 함수가 있을 때 같은 윈도우 절을 반복하지 않도록 해주므로 유용해요.

QUALIFY

QUALIFYWINDOW 함수의 결과를 필터링하는 데 사용돼요.

ORDER BY, LIMIT, OFFSET

ORDER BY, LIMITOFFSET은 출력 수정자예요. 논리적으로는 쿼리의 맨 끝에 적용돼요. ORDER BY 절은 정렬 기준에 따라 행을 오름차순 또는 내림차순으로 정렬해요. LIMIT 절은 가져오는 행의 수를 제한하는 반면, OFFSET 절은 값을 읽기 시작할 위치를 나타내요.

VALUES 목록

VALUES 목록SELECT 문 대신 제공되는 값의 집합이에요.

행 ID (Row IDs)

각 테이블에 대해 rowid 의사 열(pseudocolumn)은 물리적 저장소를 기반으로 한 행 식별자를 반환해요.

CREATE TABLE t (id INTEGER, content VARCHAR);
INSERT INTO t VALUES (42, 'hello'), (43, 'world');
SELECT rowid, id, content FROM t;
rowid id content
0 42 hello
1 43 world

현재 저장소에서 행이 삭제되지 않았다면 이러한 식별자는 연속적인 부호 없는 정수(0, 1, ...)예요. 삭제는 rowid에 갭을 도입하며, 이는 나중에 재사용될 수 있어요:

CREATE OR REPLACE TABLE t AS (FROM range(10) r(i));
DELETE FROM t WHERE i % 2 = 0;
SELECT rowid FROM t;
rowid
1
3
5
7
9

rowid 값은 트랜잭션 내에서 안정적이에요.

모범 사례: rowid를 식별자로 사용하는 것을 피하는 것이 강력히 권장돼요.

참고: 사용자 정의 열에 rowid라는 이름이 있으면 rowid 의사 열을 가리게 돼요 (shadow).

공통 테이블 표현식 (Common Table Expressions)

WITH 절을 사용해 CTE를 지정할 수 있어요. 자세한 내용은 WITH 절을 참고하세요.

전체 문법 다이어그램 (Full Syntax Diagram)

아래는 SELECT 문의 전체 문법 다이어그램이에요.

더 알아보기 (Learn more)