SELECT

SELECT

SELECT 쿼리는 데이터 검색을 수행해요. 기본적으로 요청된 데이터는 클라이언트에 반환되며, INSERT INTO와 함께 사용하면 다른 테이블로 전달될 수 있습니다.

출처: 문서

본문

Syntax

[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]
[LIMIT [n] AFTER start_expr [ALL] [UNTIL end_expr] | LIMIT [n] UNTIL end_expr]
[SETTINGS ...]
[UNION  ...]
[INTO OUTFILE filename [TRUNCATE] [COMPRESSION type [LEVEL level]] ]
[FORMAT format]

SELECT 바로 뒤의 표현식 목록은 필수이며, 다른 모든 절은 선택 사항입니다.

SELECT와 선택 절은 별도 섹션에서 다룹니다:

쿼리는 pipe operators로 변환의 선형 체인으로도 쓸 수 있습니다:

FROM table
|> WHERE x > 1
|> AGGREGATE count() AS c GROUP BY y
|> ORDER BY c DESC

SELECT Clause

SELECT 절에 지정된 Expressions은 위에서 설명한 절들의 모든 연산이 끝난 후에 계산됩니다. 이 표현식들은 결과의 별도 행에 적용되는 것처럼 동작합니다. SELECT 절의 표현식이 집계 함수를 포함하면, ClickHouse는 GROUP BY 집계 중에 집계 함수와 그 인자로 사용된 표현식을 처리합니다.

결과에 모든 컬럼을 포함하려면 asterisk(*) 기호를 사용하세요. 예: SELECT * FROM ....

Dynamic column selection

동적 컬럼 선택(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가 예외를 발생시킵니다.

Select columns with LIKE or ILIKE

* 뒤에 대소문자 구분 LIKE 또는 대소문자 무시 ILIKE를 사용해 이름을 패턴과 매칭하여 컬럼을 선택할 수도 있습니다:

SELECT * ILIKE 'a%' FROM col_names
┌─aa─┬─ab─┐
│  1 │  1 │
└────┴────┘

LIKEILIKE 패턴은 정규 표현식 의미론이 아니라 LIKE 의미론을 따릅니다. % 문자는 모든 문자 시퀀스와 매칭되고, _ 문자는 단일 문자와 매칭되며, \%, _, \를 이스케이프합니다. 둘의 유일한 차이는 LIKE는 컬럼 이름을 대소문자 구분으로 매칭하고 ILIKE는 대소문자 무시라는 것입니다. 예를 들어:

SELECT * ILIKE 'a_' FROM col_names

이 쿼리는 aa, ab처럼 두 문자 이름이고 a로 시작하는 컬럼을 선택합니다.

* LIKE* ILIKE는 한정된 asterisk와 컬럼 변환기도 지원합니다:

SELECT t.* ILIKE 'a%' EXCEPT (ab) FROM col_names AS t
┌─aa─┐
│  1 │
└────┘

Asterisk

쿼리의 어떤 부분에서든 표현식 대신 asterisk를 둘 수 있습니다. 쿼리를 분석할 때 asterisk는 모든 테이블 컬럼(MATERIALIZEDALIAS 컬럼 제외)의 목록으로 확장됩니다. asterisk 사용이 정당한 경우는 몇 가지뿐입니다:

  • 테이블 덤프를 만들 때.
  • 시스템 테이블처럼 몇 개의 컬럼만 가진 테이블의 경우.
  • 테이블에 어떤 컬럼이 있는지 정보를 얻을 때. 이 경우 LIMIT 1을 설정하세요. 하지만 DESC TABLE 쿼리를 사용하는 것이 낫습니다.
  • PREWHERE로 소수의 컬럼에 대해 강한 필터링이 있을 때.
  • 서브쿼리에서(외부 쿼리에 필요하지 않은 컬럼은 서브쿼리에서 제외되므로).

다른 모든 경우에는 asterisk 사용을 권장하지 않습니다. 그것은 컬럼형 DBMS의 장점이 아니라 단점만 제공하기 때문입니다. 즉 asterisk 사용은 권장되지 않습니다.

Extreme Values

결과 외에도 결과 컬럼의 최소 및 최대 값을 얻을 수 있어요. 이렇게 하려면 extremes 설정을 1로 설정하세요. 최소/최대는 숫자 타입, 날짜, 날짜시간에 대해 계산됩니다. 다른 컬럼의 경우 기본 값이 출력됩니다.

최소값과 최대값 각각에 해당하는 추가 행 두 개가 계산됩니다. 이 추가 행 두 개는 XML, JSON*, TabSeparated*, CSV*, Vertical, TemplatePretty* formats에서 다른 행과 분리되어 출력됩니다. 다른 형식에서는 출력되지 않습니다.

JSON*XML 형식에서 극단 값은 별도의 'extremes' 필드에 출력됩니다. TabSeparated*, CSV*, Vertical 형식에서 행은 메인 결과 뒤, 그리고 'totals'가 있으면 그 뒤에 옵니다. 그 앞에는 빈 행(다른 데이터 뒤)이 옵니다. Pretty* 형식에서 행은 메인 결과 뒤, 그리고 totals가 있으면 그 뒤에 별도 테이블로 출력됩니다. Template 형식에서 극단 값은 지정된 템플릿에 따라 출력됩니다.

극단 값은 LIMIT 전이지만 LIMIT BY 후의 행에 대해 계산됩니다. 그러나 LIMIT offset, size를 사용할 때 offset 이전의 행은 extremes에 포함됩니다. LIMIT ... AFTER ... UNTIL 범위는 여기서 LIMIT처럼 동작합니다. 극단은 범위가 적용되기 전에 읽은 행에 대해 계산됩니다. 스트림 요청에서 결과는 LIMIT를 통과한 소수의 행도 포함할 수 있어요.

Notes

쿼리의 어떤 부분에서든 동의어(AS 별칭)를 사용할 수 있습니다.

GROUP BY, ORDER BY, LIMIT BY 절은 위치 인자를 지원할 수 있습니다. 이를 활성화하려면 enable_positional_arguments 설정을 켜세요. 그러면 예를 들어 ORDER BY 1,2는 테이블의 행을 첫 번째 컬럼으로, 그다음 두 번째 컬럼으로 정렬합니다.

Implementation Details

쿼리가 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

자세한 내용은 "Settings" 섹션을 참고하세요. 외부 정렬(임시 테이블을 디스크에 저장)과 외부 집계를 사용하는 것이 가능합니다.

SELECT modifiers

SELECT 쿼리에서 다음 수정자를 사용할 수 있습니다.

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

Modifier Combinations

각 수정자를 개별적으로 또는 결합해 사용할 수 있습니다.

Examples:

같은 수정자를 여러 번 사용하기.

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 │
└─────────────────┴────────┘

SETTINGS in SELECT Query

SELECT 쿼리 안에서 필요한 설정을 바로 지정할 수 있습니다. 설정 값은 이 쿼리에만 적용되며 쿼리 실행 후 기본값 또는 이전 값으로 재설정됩니다.

설정을 만드는 다른 방법은 여기를 참고하세요.

참으로 설정된 불리언 설정의 경우 값 할당을 생략하는 축약 문법을 사용할 수 있습니다. 설정 이름만 지정되면 자동으로 1(true)로 설정됩니다.

Example

SELECT * FROM some_table SETTINGS optimize_read_in_order=1, cast_keep_nullable=1;

더 알아보기 (Learn more)