연산자
ClickHouse는 연산자의 우선순위(priority), 우선도(precedence), 결합 방향(associativity)에 따라 쿼리 파싱 단계에서 각 연산자를 해당 함수로 변환합니다.
Access 연산자
a[N] – 배열 요소에 접근합니다. arrayElement(a, N) FUNCTION과 같습니다.
a.N – 튜플 요소에 접근합니다. tupleElement(a, N) FUNCTION과 같습니다.
수치 부정 연산자
-a – negate (a) FUNCTION입니다.
튜플 부정에는 tupleNegate를 사용합니다.
곱셈 및 나눗셈 연산자
a * b – multiply(a, b) FUNCTION입니다.
튜플에 숫자를 곱할 때는 tupleMultiplyByNumber, 스칼라 곱(scalar product)에는 dotProduct를 사용합니다.
a / b – divide(a, b) FUNCTION입니다.
튜플을 숫자로 나눌 때는 tupleDivideByNumber를 사용합니다.
a % b – modulo(a, b) FUNCTION입니다.
덧셈 및 뺄셈 연산자
a + b – plus(a, b) 함수입니다.
튜플 덧셈의 경우: tuplePlus.
a - b – minus(a, b) 함수입니다.
튜플 뺄셈의 경우: tupleMinus.
비교 연산자
equals 함수
a = b – equals(a, b) 함수입니다.
a == b – equals(a, b) 함수입니다.
notEquals 함수
a != b – notEquals(a, b) 함수입니다.
a <> b – notEquals(a, b) 함수입니다.
lessOrEquals 함수
a <= b – lessOrEquals(a, b) 함수입니다.
greaterOrEquals 함수
a >= b – greaterOrEquals(a, b) 함수입니다.
less 함수
a < b – less(a, b) 함수와 같습니다.
greater 함수
a > b – greater(a, b) 함수에 해당합니다.
like 함수
a LIKE b – like(a, b) 함수입니다.
notLike 함수
a NOT LIKE b – notLike(a, b) 함수입니다.
ilike 함수
a ILIKE b – ilike(a, b) 함수입니다.
BETWEEN 함수
a BETWEEN b AND c – a >= b AND a <= c와 같습니다.
a NOT BETWEEN b AND c – a < b OR a > c와 같습니다.
is not distinct from 연산자 (<=>)
25.10부터는 <=> 연산자를 다른 연산자와 마찬가지로 사용할 수 있습니다.
25.10 이전에는 JOIN 표현식에서만 사용할 수 있었으며, 예를 들어 다음과 같습니다:
<=> 연산자는 NULL-안전 동등 연산자로, IS NOT DISTINCT FROM와 동일합니다.
일반 동등 연산자(=)처럼 동작하지만, NULL 값을 서로 비교 가능한 값으로 취급합니다.
두 NULL 값은 서로 같다고 간주되며, NULL 값과 NULL이 아닌 값을 비교하면 NULL 대신 0 (false)을 반환합니다.
데이터 Set 작업을 위한 연산자
in 함수
a IN ... – in(a, b) 함수입니다.
notIn 함수
a NOT IN ... – 는 notIn(a, b) FUNCTION입니다.
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 서브쿼리 함수
a = ALL (subquery) – a IN (SELECT singleValueOrNull(*) FROM subquery)와 동일합니다.
notIn 서브쿼리 함수
a != ALL (subquery) – notIn(a, subquery) 함수입니다.
예시
ALL을 사용하는 쿼리:
결과:
ANY를 사용하는 쿼리:
결과:
날짜 및 시간 처리를 위한 연산자
EXTRACT
지정한 날짜에서 특정 파트를 추출합니다. 예를 들어, 지정한 날짜에서 월을 가져오거나, 시간에서 초를 가져올 수 있습니다.
part 파라미터는 날짜의 어느 파트를 가져올지 지정합니다. 사용할 수 있는 값은 다음과 같습니다:
SECOND— 초입니다. 가능한 값: 0–59.MINUTE— 분입니다. 가능한 값: 0–59.HOUR— 시입니다. 가능한 값: 0–23.DAY— 한 달 중 일(day)입니다. 가능한 값: 1–31.WEEK— ISO 8601 주 번호입니다. 가능한 값: 1–53.MONTH— 월을 나타내는 숫자입니다. 가능한 값: 1–12.QUARTER— 분기입니다. 가능한 값: 1–4.YEAR— 연도입니다.EPOCH— Unix 타임스탬프입니다(1970-01-01 00:00:00 UTC 이후의 초). 참고:DateTime64의 경우, 1초 미만 부분은 잘립니다.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년은 제3천년기에 속합니다.
part 파라미터는 대소문자를 구분하지 않습니다.
date 파라미터는 처리할 날짜 또는 시간을 지정합니다. Date, Date32, DateTime, DateTime64 타입을 지원합니다.
예시:
다음 예시에서는 테이블을 생성하고, 해당 테이블에 DateTime 타입 값을 하나 INSERT합니다.
tests에서 더 많은 예시를 확인할 수 있습니다.
INTERVAL
Interval 타입 값을 생성하며, 이 값은 Date 및 DateTime 타입 값과의 산술 연산에 사용됩니다.
Interval 타입의 종류:
SECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR
INTERVAL 값을 설정할 때 문자열 리터럴도 사용할 수 있습니다. 예를 들어, INTERVAL 1 HOUR는 INTERVAL '1 hour' 또는 INTERVAL '1' hour와 동일합니다.
서로 다른 타입의 Interval은 함께 사용할 수 없습니다. INTERVAL 4 DAY 1 HOUR와 같은 표현은 사용할 수 없습니다. Interval의 가장 작은 단위보다 작거나 같은 단위로 Interval을 지정하십시오. 예를 들어, INTERVAL 25 HOUR처럼 지정합니다. 아래 예시와 같이 여러 번의 연산을 연달아 사용할 수 있습니다.
예시:
INTERVAL 구문이나 addDays 함수 사용을 항상 권장합니다. now() + ...와 같은 단순 덧셈 또는 뺄셈 구문은 시간 설정을 고려하지 않습니다. 예를 들어, 일광 절약 시간제(서머타임)가 반영되지 않습니다.
예시:
추가 참고
- Interval 데이터 형식
- toInterval 변환 함수
논리 AND 연산자
구문 SELECT a AND b — 함수 and를 사용하여 a와 b의 논리곱을 계산합니다.
논리 OR 연산자
SELECT a OR b 구문은 함수 or를 사용하여 a와 b의 논리합을 계산합니다.
논리 부정 연산자
구문은 SELECT NOT a 형식이며, 함수 not를 사용해 a의 논리 부정 값을 계산합니다.
조건 연산자
a ? b : c – if(a, b, c) 함수입니다.
참고:
조건 연산자는 먼저 b와 c의 값을 계산한 다음, 조건 a가 충족되는지 확인하고 해당 값을 반환합니다. b 또는 c가 arrayJoin() 함수이면, 조건 a와 상관없이 각 행이 모두 복제됩니다.
조건식
x가 지정된 경우 transform(x, [a, ...], [b, ...], c) 함수가 사용됩니다. 그렇지 않으면 multiIf(a, b, ..., c) 함수가 사용됩니다.
식에 ELSE c 절이 없는 경우 기본값은 NULL입니다.
transform 함수는 NULL 값을 처리하지 않습니다.
Concatenation Operator
s1 || s2 – concat(s1, s2) FUNCTION과 같습니다.
람다 생성 연산자
x -> expr – lambda(x, expr) 함수입니다.
다음 연산자들은 괄호이므로 우선순위가 없습니다:
배열 생성 연산자
[x1, ...] – array(x1, ...) 함수입니다.
튜플 생성 연산자
(x1, x2, ...) – tuple(x1, x2, ...) 함수입니다.
결합법칙(Associativity)
모든 이항 연산자는 좌결합입니다. 예를 들어 1 + 2 + 3 은 plus(plus(1, 2), 3) 으로 변환됩니다.
하지만 항상 예상한 대로 동작하는 것은 아닙니다. 예를 들어 SELECT 4 > 2 > 3 의 결과는 0이 됩니다.
효율성을 위해 and 와 or 함수는 임의 개수의 인수를 허용합니다. 이에 따라 AND 와 OR 연산자로 이루어진 연쇄는 이 함수들에 대한 하나의 호출로 변환됩니다.
NULL 값 확인
ClickHouse는 IS NULL와 IS NOT NULL 연산자를 지원합니다.
IS NULL
- 널 허용(Nullable) 타입의 값에 대해
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로 변환됩니다.
IS NOT NULL
- 널 허용 타입의 값에 대해
IS NOT NULL연산자는 다음과 같이 동작합니다.- 값이
NULL이면0을 반환합니다. - 그렇지 않으면
1을 반환합니다.
- 값이
- 그 외 타입의 값에 대해서는
IS NOT NULL연산자는 항상1을 반환합니다.
optimize_functions_to_subcolumns 설정을 활성화하여 최적화할 수 있습니다. optimize_functions_to_subcolumns = 1인 경우 함수는 전체 컬럼 데이터를 읽고 처리하는 대신 null 서브컬럼만 읽습니다. SELECT n IS NOT NULL FROM table 쿼리는 SELECT NOT n.null FROM TABLE로 변환됩니다.