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와 선택 절은 별도 섹션에서 다룹니다:
- WITH clause
- SELECT clause
- ALL clause
- DISTINCT clause
- FROM clause
- SAMPLE clause
- ARRAY JOIN clause
- JOIN clause
- PREWHERE clause
- WHERE clause
- GROUP BY clause
- HAVING clause
- WINDOW clause
- QUALIFY clause
- ORDER BY clause
- LIMIT BY clause
- LIMIT clause
- OFFSET clause
- UNION clause
- INTERSECT clause
- EXCEPT clause
- INTO OUTFILE clause
- FORMAT clause
쿼리는 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')는 aa와 ab 두 컬럼을 반환합니다. 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 │
└────┴────┘
LIKE와 ILIKE 패턴은 정규 표현식 의미론이 아니라 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는 모든 테이블 컬럼(MATERIALIZED 및 ALIAS 컬럼 제외)의 목록으로 확장됩니다. asterisk 사용이 정당한 경우는 몇 가지뿐입니다:
- 테이블 덤프를 만들 때.
- 시스템 테이블처럼 몇 개의 컬럼만 가진 테이블의 경우.
- 테이블에 어떤 컬럼이 있는지 정보를 얻을 때. 이 경우
LIMIT 1을 설정하세요. 하지만DESC TABLE쿼리를 사용하는 것이 낫습니다. PREWHERE로 소수의 컬럼에 대해 강한 필터링이 있을 때.- 서브쿼리에서(외부 쿼리에 필요하지 않은 컬럼은 서브쿼리에서 제외되므로).
다른 모든 경우에는 asterisk 사용을 권장하지 않습니다. 그것은 컬럼형 DBMS의 장점이 아니라 단점만 제공하기 때문입니다. 즉 asterisk 사용은 권장되지 않습니다.
Extreme Values
결과 외에도 결과 컬럼의 최소 및 최대 값을 얻을 수 있어요. 이렇게 하려면 extremes 설정을 1로 설정하세요. 최소/최대는 숫자 타입, 날짜, 날짜시간에 대해 계산됩니다. 다른 컬럼의 경우 기본 값이 출력됩니다.
최소값과 최대값 각각에 해당하는 추가 행 두 개가 계산됩니다. 이 추가 행 두 개는 XML, JSON*, TabSeparated*, CSV*, Vertical, Template 및 Pretty* 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_usagemax_rows_to_group_bymax_rows_to_sortmax_rows_in_distinctmax_bytes_in_distinctmax_rows_in_setmax_bytes_in_setmax_rows_in_joinmax_bytes_in_joinmax_bytes_before_external_sortmax_bytes_ratio_before_external_sortmax_bytes_before_external_group_bymax_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;