메인 콘텐츠로 건너뛰기
SELECT 쿼리는 데이터를 조회합니다. 기본적으로 요청한 데이터는 클라이언트에 반환되며, INSERT INTO와 함께 사용하면 다른 테이블로 전달할 수도 있습니다.

구문

[WITH expr_list(subquery)]
SELECT [DISTINCT [ON (column1, column2, ...)]] expr_list
[FROM [db.]table | (subquery) | table_function] [FINAL]
[SAMPLE sample_coeff]
[ARRAY JOIN ...]
[GLOBAL] [ANY|ALL|ASOF] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI] JOIN (subquery)|table [(alias1 [, alias2 ...])] (ON <expr_list>)|(USING <column_list>)
[PREWHERE expr]
[WHERE expr]
[GROUP BY expr_list] [WITH ROLLUP|WITH CUBE] [WITH TOTALS]
[HAVING expr]
[WINDOW window_expr_list]
[QUALIFY expr]
[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr] [INTERPOLATE [(expr_list)]]
[LIMIT [offset_value, ]n BY columns]
[LIMIT [n, ]m] [WITH TIES]
[SETTINGS ...]
[UNION  ...]
[INTO OUTFILE filename [TRUNCATE] [COMPRESSION type [LEVEL level]] ]
[FORMAT format]
모든 절은 선택 사항입니다. 단, SELECT 바로 뒤에 오는 필수 표현식 목록은 예외이며, 이에 대해서는 아래에서 더 자세히 설명합니다. 각 선택적 절의 세부 내용은 별도의 섹션에서 설명하며, 실제 실행 순서와 동일한 순서로 나열되어 있습니다:

SELECT 절

SELECT 절에 지정된 표현식은 위에서 설명한 절의 모든 작업이 끝난 후 계산됩니다. 이러한 표현식은 결과의 각 행에 개별적으로 적용되는 것처럼 동작합니다. SELECT 절의 표현식에 집계 함수가 포함된 경우, ClickHouse는 GROUP BY 집계 과정에서 집계 함수와 그 인수로 사용된 표현식을 처리합니다. 결과에 모든 컬럼을 포함하려면 별표(*) 기호를 사용하십시오. 예를 들어 SELECT * FROM ...와 같습니다.

동적 컬럼 선택

동적 컬럼 선택(또는 COLUMNS 표현식)은 re2 정규식을 사용해 결과의 일부 컬럼을 선택할 수 있게 해줍니다.
COLUMNS('regexp')
예를 들어, 다음 테이블을 살펴보겠습니다:
CREATE TABLE default.col_names (aa Int8, ab Int8, bc Int8) ENGINE = TinyLog
다음 쿼리는 이름에 a 기호가 포함된 모든 컬럼의 데이터를 선택합니다.
SELECT COLUMNS('a') FROM col_names
┌─aa─┬─ab─┐
│  1 │  1 │
└────┴────┘
선택한 컬럼은 알파벳순으로 반환되지 않습니다. 하나의 쿼리에서 여러 COLUMNS 표현식을 사용할 수 있으며, 여기에 함수를 적용할 수도 있습니다. 예시:
SELECT COLUMNS('a'), COLUMNS('c'), toTypeName(COLUMNS('c')) FROM col_names
┌─aa─┬─ab─┬─bc─┬─toTypeName(bc)─┐
│  1 │  1 │  1 │ Int8           │
└────┴────┴────┴────────────────┘
COLUMNS 표현식이 반환하는 각 컬럼은 함수에 개별 인수로 전달됩니다. 또한 함수가 지원하는 경우 다른 인수도 함께 전달할 수 있습니다. 함수를 사용할 때는 주의해야 합니다. 전달한 인수의 개수를 함수가 지원하지 않으면 ClickHouse는 예외를 발생시킵니다. 예시:
SELECT COLUMNS('a') + COLUMNS('c') FROM col_names
Received exception from server (version 19.14.1):
Code: 42. DB::Exception: Received from localhost:9000. DB::Exception: Number of arguments for function plus does not match: passed 3, should be 2.
이 예시에서 COLUMNS('a')aaab라는 두 개의 컬럼을 반환합니다. COLUMNS('c')bc 컬럼을 반환합니다. + 연산자는 3개의 인수에 적용할 수 없으므로 ClickHouse는 이에 대한 관련 메시지와 함께 예외를 발생시킵니다. COLUMNS 표현식과 일치하는 컬럼은 서로 다른 데이터 타입일 수 있습니다. COLUMNS가 어떤 컬럼과도 일치하지 않고 SELECT의 유일한 표현식인 경우 ClickHouse는 예외를 발생시킵니다.

별표

쿼리의 어느 부분에서든 표현식 대신 별표를 사용할 수 있습니다. 쿼리를 분석할 때 별표는 모든 테이블 컬럼의 목록으로 확장됩니다(MATERIALIZEDALIAS 컬럼 제외). 별표 사용이 적절한 경우는 몇 가지뿐입니다.
  • 테이블 덤프를 만들 때
  • 시스템 테이블처럼 컬럼 수가 많지 않은 테이블인 경우
  • 테이블에 어떤 컬럼이 있는지 확인할 때. 이 경우 LIMIT 1을 설정합니다. 하지만 DESC TABLE 쿼리를 사용하는 편이 더 좋습니다.
  • PREWHERE를 사용해 적은 수의 컬럼에 강한 필터링이 적용될 때
  • 서브쿼리에서(외부 쿼리에 필요하지 않은 컬럼은 서브쿼리에서 제외되므로)
그 밖의 모든 경우에는 별표 사용을 권장하지 않습니다. 별표를 사용하면 열 지향 DBMS의 장점은 살리지 못하고 단점만 초래하기 때문입니다. 다시 말해, 별표 사용은 권장되지 않습니다.

극값

결과뿐 아니라 결과 컬럼의 최솟값과 최댓값도 확인할 수 있습니다. 이를 위해 extremes 설정을 1로 지정합니다. 최솟값과 최댓값은 숫자 타입, 날짜, 날짜-시간 타입에 대해 계산됩니다. 다른 컬럼에는 기본값이 출력됩니다. 최솟값과 최댓값에 해당하는 2개의 추가 행도 계산됩니다. 이 2개의 추가 행은 XML, JSON*, TabSeparated*, CSV*, Vertical, Template, Pretty* 포맷에서 다른 행과 분리되어 출력됩니다. 다른 포맷에서는 출력되지 않습니다. JSON*XML 포맷에서는 극값이 별도의 ‘extremes’ 필드에 출력됩니다. TabSeparated*, CSV*, Vertical 포맷에서는 이 행이 기본 결과 뒤에 출력되며, totals가 있으면 그 뒤에 출력됩니다. 또한 그 앞에는 빈 행이 하나 추가됩니다(다른 데이터 뒤). Pretty* 포맷에서는 이 행이 기본 결과 뒤에, totals가 있으면 그 뒤에 별도의 테이블로 출력됩니다. Template 포맷에서는 지정된 템플릿에 따라 극값이 출력됩니다. 극값은 LIMIT 이전의 행을 기준으로 계산되지만, LIMIT BY는 적용된 이후입니다. 하지만 LIMIT offset, size를 사용할 경우 offset 이전의 행도 extremes에 포함됩니다. 스트림 요청에서는 LIMIT를 거친 소수의 행이 결과에 추가로 포함될 수도 있습니다.

참고 사항

쿼리의 모든 부분에서 동의어(AS 별칭)를 사용할 수 있습니다. GROUP BY, ORDER BY, LIMIT BY 절은 위치 인수를 지원합니다. 이를 사용하려면 enable_positional_arguments 설정을 켜십시오. 그러면 예를 들어 ORDER BY 1,2는 테이블을 첫 번째 컬럼, 그다음 두 번째 컬럼 기준으로 행을 정렬합니다.

구현 세부 사항

쿼리에서 DISTINCT, GROUP BY, ORDER BY 절과 IN, JOIN 서브쿼리를 생략하면, O(1) 크기의 RAM만 사용하여 전체 쿼리를 완전히 스트림 방식으로 처리할 수 있습니다. 그렇지 않으면 적절한 제한을 지정하지 않은 경우 쿼리가 많은 RAM을 사용할 수 있습니다.
  • max_memory_usage
  • max_rows_to_group_by
  • max_rows_to_sort
  • max_rows_in_distinct
  • max_bytes_in_distinct
  • max_rows_in_set
  • max_bytes_in_set
  • max_rows_in_join
  • max_bytes_in_join
  • max_bytes_before_external_sort
  • max_bytes_ratio_before_external_sort
  • max_bytes_before_external_group_by
  • max_bytes_ratio_before_external_group_by
자세한 내용은 “설정” 섹션을 참조하십시오. 외부 정렬(임시 테이블을 디스크에 저장하는 방식)과 외부 집계를 사용할 수 있습니다.

SELECT 수정자

SELECT 쿼리에서 다음 수정자를 사용할 수 있습니다.
ModifierDescription
APPLY쿼리의 외부 테이블 표현식이 반환하는 각 행에 대해 함수를 호출할 수 있게 합니다.
EXCEPT결과에서 제외할 하나 이상의 컬럼 이름을 지정합니다. 일치하는 모든 컬럼 이름은 출력에서 생략됩니다.
REPLACE하나 이상의 표현식 별칭을 지정합니다. 각 별칭은 SELECT * SQL 문의 컬럼 이름과 일치해야 합니다. 출력 컬럼 목록에서는 해당 별칭과 일치하는 컬럼이 그 REPLACE의 표현식으로 대체됩니다. 이 수정자는 컬럼의 이름이나 순서는 변경하지 않습니다. 하지만 값과 값의 유형은 변경할 수 있습니다.

수정자 조합

각 수정자는 개별적으로 사용할 수도 있고, 함께 조합해 사용할 수도 있습니다. 예시: 동일한 수정자를 여러 번 사용하는 경우입니다.
SELECT COLUMNS('[jk]') APPLY(toString) APPLY(length) APPLY(max) FROM columns_transformers;
┌─max(length(toString(j)))─┬─max(length(toString(k)))─┐
│                        2 │                        3 │
└──────────────────────────┴──────────────────────────┘
하나의 쿼리에서 여러 수정자를 사용합니다.
SELECT * REPLACE(i + 1 AS i) EXCEPT (j) APPLY(sum) from columns_transformers;
┌─sum(plus(i, 1))─┬─sum(k)─┐
│             222 │    347 │
└─────────────────┴────────┘

SELECT 쿼리의 SETTINGS

필요한 설정을 SELECT 쿼리 안에 직접 지정할 수 있습니다. 설정 값은 이 쿼리에만 적용되며, 쿼리 실행 후에는 기본값 또는 이전 값으로 다시 설정됩니다. 설정을 지정하는 다른 방법은 여기를 참조하십시오. true로 설정되는 불리언 설정의 경우, 값 할당을 생략하는 축약 구문을 사용할 수 있습니다. 설정 이름만 지정하면 자동으로 1(true)로 설정됩니다. 예시
SELECT * FROM some_table SETTINGS optimize_read_in_order=1, cast_keep_nullable=1;
마지막 수정일 2026년 6월 10일