메인 콘텐츠로 건너뛰기
ClickHouse는 쿼리 파싱 단계에서 연산자의 priority, precedence, 결합 방향에 따라 해당하는 함수로 변환합니다.

접근 연산자

a[N] – 배열 요소에 접근합니다. arrayElement(a, N) 함수입니다. a.N – 튜플 요소에 접근합니다. tupleElement(a, N) 함수입니다.

숫자 부호 반전 연산자

-anegate(a) 함수입니다. 튜플 부호 반전은 다음을 참조하십시오: tupleNegate.

곱셈 및 나눗셈 연산자

a * bmultiply(a, b) 함수입니다. 튜플에 숫자를 곱하려면 tupleMultiplyByNumber, 스칼라 곱에는 dotProduct를 사용합니다. a / bdivide(a, b) 함수입니다. 튜플을 숫자로 나누려면 tupleDivideByNumber를 사용합니다. a % bmodulo(a, b) 함수입니다。

덧셈 및 뺄셈 연산자

a + bplus(a, b) 함수입니다. 튜플 덧셈: tuplePlus. a - bminus(a, b) 함수입니다. 튜플 뺄셈: tupleMinus.

비교 연산자

equals 함수

a = bequals(a, b) 함수입니다. a == bequals(a, b) 함수입니다.

notEquals 함수

a != bnotEquals(a, b) 함수입니다. a <> bnotEquals(a, b) 함수입니다.

lessOrEquals 함수

a <= b - lessOrEquals(a, b) 함수입니다.

greaterOrEquals 함수

a >= bgreaterOrEquals(a, b) 함수입니다.

less 함수

a < bless(a, b) 함수입니다.

greater 함수

a > bgreater(a, b) 함수입니다.

like 함수

a LIKE blike(a, b) 함수입니다.

notLike 함수

a NOT LIKE bnotLike(a, b) 함수입니다.

ilike 함수

a ILIKE bilike(a, b) 함수입니다.

BETWEEN 함수

a BETWEEN b AND ca >= b AND a <= c와 동일합니다. a NOT BETWEEN b AND ca < b OR a > c와 동일합니다.

is not distinct from 연산자 (<=>)

25.10부터는 <=>를 다른 연산자와 마찬가지로 사용할 수 있습니다. 25.10 이전에는 JOIN 표현식에서만 사용할 수 있었으며, 예를 들면 다음과 같습니다:
CREATE TABLE a (x String) ENGINE = Memory;
INSERT INTO a VALUES ('ClickHouse');

SELECT * FROM a AS a1 JOIN a AS a2 ON a1.x <=> a2.x;

┌─x──────────┬─a2.x───────┐
│ ClickHouse │ ClickHouse │
└────────────┴────────────┘
<=> 연산자는 NULL-안전 동등 연산자이며, IS NOT DISTINCT FROM과 동일합니다. 이 연산자는 일반 동등 연산자(=)처럼 동작하지만, NULL 값도 비교할 수 있도록 처리합니다. 두 NULL 값은 같다고 간주되며, NULLNULL이 아닌 값과 비교하면 NULL이 아니라 0(false)을 반환합니다.
SELECT
  'ClickHouse' <=> NULL,
  NULL <=> NULL
┌─isNotDistinc⋯use', NULL)─┬─isNotDistinc⋯NULL, NULL)─┐
│                        0 │                        1 │
└──────────────────────────┴──────────────────────────┘

문자열을 다루는 연산자

OVERLAY

  • OVERLAY(string PLACING replacement FROM offset) - overlay(string, replacement, offset) 함수입니다.
  • OVERLAY(string PLACING replacement FROM offset FOR length) - overlay(string, replacement, offset, length) 함수입니다.
  • OVERLAYUTF8(string PLACING replacement FROM offset) - overlayUTF8(string, replacement, offset) 함수입니다.
  • OVERLAYUTF8(string PLACING replacement FROM offset FOR length) - overlayUTF8(string, replacement, offset, length) 함수입니다.

데이터 세트 작업을 위한 연산자

IN 연산자EXISTS 연산자를 참조하십시오.

in 함수

a IN ...in(a, b) 함수입니다.

notIn 함수

a NOT IN ...에 해당하는 notIn(a, b) 함수입니다.

globalIn 함수

a GLOBAL IN ...globalIn(a, b) 함수입니다.

globalNotIn 함수

a GLOBAL NOT IN ...globalNotIn(a, b) 함수입니다.

in 서브쿼리 함수

a = ANY (subquery)in(a, subquery) 함수와 같습니다.

notIn 서브쿼리 함수

a != ANY (subquery)a NOT IN (SELECT singleValueOrNull(*) FROM subquery)와 동일합니다.

in subquery 함수

a = ALL (subquery)a IN (SELECT singleValueOrNull(*) FROM subquery)와 같습니다.

notIn 서브쿼리 함수

a != ALL (subquery)notIn(a, subquery) 함수입니다. 예시 ALL을 사용한 쿼리:
Query
SELECT number AS a FROM numbers(10) WHERE a > ALL (SELECT number FROM numbers(3, 3));
Response
┌─a─┐
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘
ANY를 사용한 쿼리:
Query
SELECT number AS a FROM numbers(10) WHERE a > ANY (SELECT number FROM numbers(3, 3));
Response
┌─a─┐
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘

날짜 및 시간을 다루는 연산자

EXTRACT

EXTRACT(part FROM date);
주어진 날짜에서 특정 부분을 추출합니다. 예를 들어, 날짜에서 월을 가져오거나 시간에서 초를 가져올 수 있습니다. part 매개변수는 날짜에서 추출할 부분을 지정합니다. 사용할 수 있는 값은 다음과 같습니다.
  • SECOND — 초입니다. 가능한 값: 0–59.
  • MINUTE — 분입니다. 가능한 값: 0–59.
  • HOUR — 시입니다. 가능한 값: 0–23.
  • DAY — 일입니다. 가능한 값: 1–31.
  • WEEK — ISO 8601 주 번호입니다. 가능한 값: 1–53.
  • MONTH — 월 번호입니다. 가능한 값: 1–12.
  • QUARTER — 분기입니다. 가능한 값: 1–4.
  • YEAR — 연도입니다.
  • EPOCH — Unix timestamp(1970-01-01 00:00:00 UTC 이후의 초)입니다. 참고: DateTime64의 경우 소수점 이하 초 부분은 잘립니다.
  • DOW — 요일(PostgreSQL 호환)입니다. 0 = 일요일, 6 = 토요일입니다.
  • DOY — 연중 날짜입니다. 가능한 값: 1–366.
  • ISODOW — ISO 요일입니다. 1 = 월요일, 7 = 일요일입니다.
  • ISOYEAR — ISO 8601 주 번호 기준 연도입니다.
  • CENTURY — 세기입니다. 예를 들어, 2024년은 21세기에 속합니다.
  • DECADE — 10년 단위입니다(연도를 10으로 나눈 값). 예를 들어, 2024년의 decade는 202입니다.
  • MILLENNIUM — 천년 단위입니다. 예를 들어, 2024년은 세 번째 millennium에 속합니다.
part 매개변수는 대소문자를 구분하지 않습니다. date 매개변수는 처리할 날짜 또는 시간을 지정합니다. Date, Date32, DateTime, DateTime64 타입을 지원합니다. 예시:
SELECT EXTRACT(DAY FROM toDate('2017-06-15'));
SELECT EXTRACT(MONTH FROM toDate('2017-06-15'));
SELECT EXTRACT(YEAR FROM toDate('2017-06-15'));
SELECT EXTRACT(EPOCH FROM toDateTime('2024-01-15 12:30:45', 'UTC'));
SELECT EXTRACT(DOW FROM toDate('2024-01-15'));
SELECT EXTRACT(CENTURY FROM toDate('2024-01-01'));
다음 예시에서는 테이블을 생성한 다음 DateTime 유형의 값을 삽입합니다.
CREATE TABLE test.Orders
(
    OrderId UInt64,
    OrderName String,
    OrderDate DateTime
) ENGINE = MergeTree
ORDER BY ();
INSERT INTO test.Orders VALUES (1, 'Jarlsberg Cheese', toDateTime('2008-10-11 13:23:44'));
SELECT
    toYear(OrderDate) AS OrderYear,
    toMonth(OrderDate) AS OrderMonth,
    toDayOfMonth(OrderDate) AS OrderDay,
    toHour(OrderDate) AS OrderHour,
    toMinute(OrderDate) AS OrderMinute,
    toSecond(OrderDate) AS OrderSecond
FROM test.Orders;
┌─OrderYear─┬─OrderMonth─┬─OrderDay─┬─OrderHour─┬─OrderMinute─┬─OrderSecond─┐
│      2008 │         10 │       11 │        13 │          23 │          44 │
└───────────┴────────────┴──────────┴───────────┴─────────────┴─────────────┘
tests에서 더 많은 예시를 확인할 수 있습니다.

INTERVAL

DateDateTime 타입 값과의 산술 연산에 사용되는 인터벌 타입 값을 생성합니다. 인터벌 타입은 다음과 같습니다.
  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • MONTH
  • QUARTER
  • YEAR
INTERVAL 값을 지정할 때 문자열 리터럴을 사용할 수도 있습니다. 예를 들어 INTERVAL 1 HOURINTERVAL '1 hour' 또는 INTERVAL '1' hour와 동일합니다.
타입이 서로 다른 인터벌은 결합할 수 없습니다. INTERVAL 4 DAY 1 HOUR와 같은 표현식은 사용할 수 없습니다. 인터벌은 가장 작은 단위 이상으로 지정해야 합니다. 예를 들어 INTERVAL 25 HOUR와 같이 지정합니다. 아래 예시와 같이 연속된 연산을 사용할 수 있습니다.
예시:
SELECT now() AS current_date_time, current_date_time + INTERVAL 4 DAY + INTERVAL 3 HOUR;
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:09:50 │                                    2020-11-08 01:09:50 │
└─────────────────────┴────────────────────────────────────────────────────────┘
SELECT now() AS current_date_time, current_date_time + INTERVAL '4 day' + INTERVAL '3 hour';
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:12:10 │                                    2020-11-08 01:12:10 │
└─────────────────────┴────────────────────────────────────────────────────────┘
SELECT now() AS current_date_time, current_date_time + INTERVAL '4' day + INTERVAL '3' hour;
┌───current_date_time─┬─plus(plus(now(), toIntervalDay('4')), toIntervalHour('3'))─┐
│ 2020-11-03 22:33:19 │                                        2020-11-08 01:33:19 │
└─────────────────────┴────────────────────────────────────────────────────────────┘
INTERVAL 구문 또는 addDays 함수를 사용하는 것이 항상 권장됩니다. 단순한 덧셈이나 뺄셈(now() + ... 같은 구문)은 시간 설정을 반영하지 않습니다. 예를 들어 일광 절약 시간제는 고려되지 않습니다.
예시:
SELECT toDateTime('2014-10-26 00:00:00', 'Asia/Istanbul') AS time, time + 60 * 60 * 24 AS time_plus_24_hours, time + toIntervalDay(1) AS time_plus_1_day;
┌────────────────time─┬──time_plus_24_hours─┬─────time_plus_1_day─┐
│ 2014-10-26 00:00:00 │ 2014-10-26 23:00:00 │ 2014-10-27 00:00:00 │
└─────────────────────┴─────────────────────┴─────────────────────┘
관련 항목

날짜 및 시간 덧셈

Date 또는 Date32 값은 + 연산자를 사용해 Time 또는 Time64 값에 더할 수 있습니다. 결과는 해당 날짜의 지정된 시각을 나타내는 DateTime 또는 DateTime64입니다. 이 연산은 교환법칙이 성립합니다. 결과 유형은 피연산자 유형에 따라 달라집니다.
왼쪽 피연산자오른쪽 피연산자결과 유형
DateTimeDateTime
DateTime64(s)DateTime64(s)
Date32TimeDateTime64(0)
Date32Time64(s)DateTime64(s)
결과에는 세션 시간대(session timezone)가 사용됩니다(세션 시간대가 설정되지 않은 경우 서버 기본 시간대 사용). date_time_overflow_behavior 설정은 결과가 표현 가능한 범위를 벗어날 때의 동작을 제어합니다.
예시:
SET use_legacy_to_time = 0;
SELECT toDate('2024-07-15') + toTime('14:30:25') AS dt, toTypeName(dt);
┌──────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 14:30:25 │ DateTime       │
└─────────────────────┴────────────────┘
SELECT toDate('2024-07-15') + toTime64('14:30:25.123456', 6) AS dt, toTypeName(dt);
┌─────────────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 14:30:25.123456 │ DateTime64(6)  │
└────────────────────────────┴────────────────┘
SELECT toTime64('23:59:59.999', 3) + toDate32('2024-07-15') AS dt, toTypeName(dt);
┌──────────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 23:59:59.999 │ DateTime64(3)  │
└─────────────────────────┴────────────────┘

논리 AND 연산자

구문 SELECT a AND b — 함수 andab의 논리곱을 계산합니다.

논리 OR 연산자

구문 SELECT a OR bor 함수를 사용해 ab의 논리합을 계산합니다.

논리 부정 연산자

구문 SELECT NOT a — 함수 not를 사용해 a의 논리 부정을 계산합니다.

조건 연산자

a ? b : cif(a, b, c) 함수입니다. 참고: 조건 연산자는 먼저 b와 c의 값을 계산한 다음, 조건 a가 참인지 확인하고 그에 해당하는 값을 반환합니다. b 또는 CarrayJoin() 함수인 경우, “a” 조건과 관계없이 각 행이 복제됩니다.

조건부 표현식

CASE [x]
    WHEN a THEN b
    [WHEN ... THEN ...]
    [ELSE c]
END
x가 지정되면 transform(x, [a, ...], [b, ...], c) 함수를 사용합니다. 그렇지 않으면 multiIf(a, b, ..., c)를 사용합니다. 표현식에 ELSE c 절이 없으면 기본값은 NULL입니다. transform 함수는 NULL에서는 작동하지 않습니다.

연결 연산자

s1 || s2concat(s1, s2) 함수입니다.

람다 생성 연산자

x -> exprlambda(x, expr) 함수. 다음 연산자는 괄호이므로 우선순위가 없습니다:

배열 생성 연산자

[x1, ...]array(x1, ...) 함수.

튜플 생성 연산자

(x1, x2, ...)tuple(x2, x2, ...) 함수입니다.

결합 방향

모든 이항 연산자는 좌결합입니다. 예를 들어 1 + 2 + 3plus(plus(1, 2), 3)으로 변환됩니다. 하지만 때로는 이것이 예상대로 동작하지 않을 수 있습니다. 예를 들어 SELECT 4 > 2 > 3의 결과는 0입니다. 효율성을 위해 andor 함수는 인수를 개수 제한 없이 받을 수 있습니다. 이에 해당하는 ANDOR 연산자 체인은 이 함수를 한 번 호출하는 형태로 변환됩니다.

NULL 검사하기

ClickHouse는 IS NULLIS NOT NULL 연산자를 지원합니다.

IS NULL

  • 널 허용 타입 값에서 IS NULL 연산자는 다음을 반환합니다.
    • 값이 NULL이면 1
    • 그렇지 않으면 0
  • 그 밖의 값에서는 IS NULL 연산자가 항상 0을 반환합니다.
optimize_functions_to_subcolumns 설정을 활성화하면 이 동작을 최적화할 수 있습니다. optimize_functions_to_subcolumns = 1이면 함수는 전체 컬럼 데이터를 읽고 처리하는 대신 null 서브컬럼만 읽습니다. SELECT n IS NULL FROM table 쿼리는 SELECT n.null FROM TABLE로 변환됩니다.
SELECT x+100 FROM t_null WHERE y IS NULL
┌─plus(x, 100)─┐
│          101 │
└──────────────┘

IS NOT NULL

  • 널 허용 타입의 값에 대해 IS NOT NULL 연산자는 다음 값을 반환합니다.
    • 값이 NULL이면 0
    • 그렇지 않으면 1
  • 그 밖의 값에 대해서는 IS NOT NULL 연산자가 항상 1을 반환합니다.
SELECT * FROM t_null WHERE y IS NOT NULL
┌─x─┬─y─┐
│ 2 │ 3 │
└───┴───┘
optimize_functions_to_subcolumns 설정을 활성화하면 이를 최적화할 수 있습니다. optimize_functions_to_subcolumns = 1이면 함수는 전체 컬럼 데이터를 읽고 처리하는 대신 null 서브컬럼만 읽습니다. 쿼리 SELECT n IS NOT NULL FROM tableSELECT NOT n.null FROM TABLE로 변환됩니다.
마지막 수정일 2026년 6월 10일