> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8a08bda2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> SELECT 쿼리 문서

# SELECT 쿼리

`SELECT` 쿼리는 데이터를 조회합니다. 기본적으로 요청한 데이터는 클라이언트에 반환되며, [INSERT INTO](/ko/reference/statements/insert-into)와 함께 사용하면 다른 테이블로 전달할 수도 있습니다.

<div id="syntax">
  ## 구문
</div>

```sql theme={null}
[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-clause)에서 더 자세히 설명합니다.

각 선택적 절의 세부 내용은 별도의 섹션에서 설명하며, 실제 실행 순서와 동일한 순서로 나열되어 있습니다:

* [WITH 절](/ko/reference/statements/select/with)
* [SELECT 절](#select-clause)
* [DISTINCT 절](/ko/reference/statements/select/distinct)
* [FROM 절](/ko/reference/statements/select/from)
* [SAMPLE 절](/ko/reference/statements/select/sample)
* [JOIN 절](/ko/reference/statements/select/join)
* [PREWHERE 절](/ko/reference/statements/select/prewhere)
* [WHERE 절](/ko/reference/statements/select/where)
* [WINDOW 절](/ko/reference/functions/window-functions)
* [GROUP BY 절](/ko/reference/statements/select/group-by)
* [LIMIT BY 절](/ko/reference/statements/select/limit-by)
* [HAVING 절](/ko/reference/statements/select/having)
* [QUALIFY 절](/ko/reference/statements/select/qualify)
* [LIMIT 절](/ko/reference/statements/select/limit)
* [OFFSET 절](/ko/reference/statements/select/offset)
* [UNION 절](/ko/reference/statements/select/union)
* [INTERSECT 절](/ko/reference/statements/select/intersect)
* [EXCEPT 절](/ko/reference/statements/select/except)
* [INTO OUTFILE 절](/ko/reference/statements/select/into-outfile)
* [FORMAT 절](/ko/reference/statements/select/format)

<div id="select-clause">
  ## SELECT 절
</div>

`SELECT` 절에 지정된 [표현식](/ko/reference/syntax#expressions)은 위에서 설명한 절의 모든 작업이 끝난 후 계산됩니다. 이러한 표현식은 결과의 각 행에 개별적으로 적용되는 것처럼 동작합니다. `SELECT` 절의 표현식에 집계 함수가 포함된 경우, ClickHouse는 [GROUP BY](/ko/reference/statements/select/group-by) 집계 과정에서 집계 함수와 그 인수로 사용된 표현식을 처리합니다.

결과에 모든 컬럼을 포함하려면 별표(`*`) 기호를 사용하십시오. 예를 들어 `SELECT * FROM ...`와 같습니다.

<div id="dynamic-column-selection">
  ### 동적 컬럼 선택
</div>

동적 컬럼 선택(또는 COLUMNS 표현식)은 [re2](https://en.wikipedia.org/wiki/RE2_\(software\)) 정규식을 사용해 결과의 일부 컬럼을 선택할 수 있게 해줍니다.

```sql theme={null}
COLUMNS('regexp')
```

예를 들어, 다음 테이블을 살펴보겠습니다:

```sql theme={null}
CREATE TABLE default.col_names (aa Int8, ab Int8, bc Int8) ENGINE = TinyLog
```

다음 쿼리는 이름에 `a` 기호가 포함된 모든 컬럼의 데이터를 선택합니다.

```sql theme={null}
SELECT COLUMNS('a') FROM col_names
```

```text theme={null}
┌─aa─┬─ab─┐
│  1 │  1 │
└────┴────┘
```

선택한 컬럼은 알파벳순으로 반환되지 않습니다.

하나의 쿼리에서 여러 `COLUMNS` 표현식을 사용할 수 있으며, 여기에 함수를 적용할 수도 있습니다.

예시:

```sql theme={null}
SELECT COLUMNS('a'), COLUMNS('c'), toTypeName(COLUMNS('c')) FROM col_names
```

```text theme={null}
┌─aa─┬─ab─┬─bc─┬─toTypeName(bc)─┐
│  1 │  1 │  1 │ Int8           │
└────┴────┴────┴────────────────┘
```

`COLUMNS` 표현식이 반환하는 각 컬럼은 함수에 개별 인수로 전달됩니다. 또한 함수가 지원하는 경우 다른 인수도 함께 전달할 수 있습니다. 함수를 사용할 때는 주의해야 합니다. 전달한 인수의 개수를 함수가 지원하지 않으면 ClickHouse는 예외를 발생시킵니다.

예시:

```sql theme={null}
SELECT COLUMNS('a') + COLUMNS('c') FROM col_names
```

```text theme={null}
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는 예외를 발생시킵니다.

<div id="asterisk">
  ### 별표
</div>

쿼리의 어느 부분에서든 표현식 대신 별표를 사용할 수 있습니다. 쿼리를 분석할 때 별표는 모든 테이블 컬럼의 목록으로 확장됩니다(`MATERIALIZED` 및 `ALIAS` 컬럼 제외). 별표 사용이 적절한 경우는 몇 가지뿐입니다.

* 테이블 덤프를 만들 때
* 시스템 테이블처럼 컬럼 수가 많지 않은 테이블인 경우
* 테이블에 어떤 컬럼이 있는지 확인할 때. 이 경우 `LIMIT 1`을 설정합니다. 하지만 `DESC TABLE` 쿼리를 사용하는 편이 더 좋습니다.
* `PREWHERE`를 사용해 적은 수의 컬럼에 강한 필터링이 적용될 때
* 서브쿼리에서(외부 쿼리에 필요하지 않은 컬럼은 서브쿼리에서 제외되므로)

그 밖의 모든 경우에는 별표 사용을 권장하지 않습니다. 별표를 사용하면 열 지향 DBMS의 장점은 살리지 못하고 단점만 초래하기 때문입니다. 다시 말해, 별표 사용은 권장되지 않습니다.

<div id="extreme-values">
  ### 극값
</div>

결과뿐 아니라 결과 컬럼의 최솟값과 최댓값도 확인할 수 있습니다. 이를 위해 **extremes** 설정을 1로 지정합니다. 최솟값과 최댓값은 숫자 타입, 날짜, 날짜-시간 타입에 대해 계산됩니다. 다른 컬럼에는 기본값이 출력됩니다.

최솟값과 최댓값에 해당하는 2개의 추가 행도 계산됩니다. 이 2개의 추가 행은 `XML`, `JSON*`, `TabSeparated*`, `CSV*`, `Vertical`, `Template`, `Pretty*` [포맷](/ko/reference/formats)에서 다른 행과 분리되어 출력됩니다. 다른 포맷에서는 출력되지 않습니다.

`JSON*` 및 `XML` 포맷에서는 극값이 별도의 'extremes' 필드에 출력됩니다. `TabSeparated*`, `CSV*`, `Vertical` 포맷에서는 이 행이 기본 결과 뒤에 출력되며, `totals`가 있으면 그 뒤에 출력됩니다. 또한 그 앞에는 빈 행이 하나 추가됩니다(다른 데이터 뒤). `Pretty*` 포맷에서는 이 행이 기본 결과 뒤에, `totals`가 있으면 그 뒤에 별도의 테이블로 출력됩니다. `Template` 포맷에서는 지정된 템플릿에 따라 극값이 출력됩니다.

극값은 `LIMIT` 이전의 행을 기준으로 계산되지만, `LIMIT BY`는 적용된 이후입니다. 하지만 `LIMIT offset, size`를 사용할 경우 `offset` 이전의 행도 `extremes`에 포함됩니다. 스트림 요청에서는 `LIMIT`를 거친 소수의 행이 결과에 추가로 포함될 수도 있습니다.

<div id="notes">
  ### 참고 사항
</div>

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

`GROUP BY`, `ORDER BY`, `LIMIT BY` 절은 위치 인수를 지원합니다. 이를 사용하려면 [enable\_positional\_arguments](/ko/reference/settings/session-settings#enable_positional_arguments) 설정을 켜십시오. 그러면 예를 들어 `ORDER BY 1,2`는 테이블을 첫 번째 컬럼, 그다음 두 번째 컬럼 기준으로 행을 정렬합니다.

<div id="implementation-details">
  ## 구현 세부 사항
</div>

쿼리에서 `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`

자세한 내용은 "설정" 섹션을 참조하십시오. 외부 정렬(임시 테이블을 디스크에 저장하는 방식)과 외부 집계를 사용할 수 있습니다.

<div id="select-modifiers">
  ## SELECT 수정자
</div>

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

| Modifier                                                      | Description                                                                                                                                                                                                              |
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [`APPLY`](/ko/reference/statements/select/apply_modifier)     | 쿼리의 외부 테이블 표현식이 반환하는 각 행에 대해 함수를 호출할 수 있게 합니다.                                                                                                                                                                           |
| [`EXCEPT`](/ko/reference/statements/select/except_modifier)   | 결과에서 제외할 하나 이상의 컬럼 이름을 지정합니다. 일치하는 모든 컬럼 이름은 출력에서 생략됩니다.                                                                                                                                                                 |
| [`REPLACE`](/ko/reference/statements/select/replace_modifier) | 하나 이상의 [표현식 별칭](/ko/reference/syntax#expression-aliases)을 지정합니다. 각 별칭은 `SELECT *` SQL 문의 컬럼 이름과 일치해야 합니다. 출력 컬럼 목록에서는 해당 별칭과 일치하는 컬럼이 그 `REPLACE`의 표현식으로 대체됩니다. 이 수정자는 컬럼의 이름이나 순서는 변경하지 않습니다. 하지만 값과 값의 유형은 변경할 수 있습니다. |

<div id="modifier-combinations">
  ### 수정자 조합
</div>

각 수정자는 개별적으로 사용할 수도 있고, 함께 조합해 사용할 수도 있습니다.

**예시:**

동일한 수정자를 여러 번 사용하는 경우입니다.

```sql theme={null}
SELECT COLUMNS('[jk]') APPLY(toString) APPLY(length) APPLY(max) FROM columns_transformers;
```

```response theme={null}
┌─max(length(toString(j)))─┬─max(length(toString(k)))─┐
│                        2 │                        3 │
└──────────────────────────┴──────────────────────────┘
```

하나의 쿼리에서 여러 수정자를 사용합니다.

```sql theme={null}
SELECT * REPLACE(i + 1 AS i) EXCEPT (j) APPLY(sum) from columns_transformers;
```

```response theme={null}
┌─sum(plus(i, 1))─┬─sum(k)─┐
│             222 │    347 │
└─────────────────┴────────┘
```

<div id="settings-in-select-query">
  ## SELECT 쿼리의 SETTINGS
</div>

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

설정을 지정하는 다른 방법은 [여기](/ko/concepts/features/configuration/settings/overview)를 참조하십시오.

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

**예시**

```sql theme={null}
SELECT * FROM some_table SETTINGS optimize_read_in_order=1, cast_keep_nullable=1;
```
