연산자
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 파라미터는 날짜의 어느 파트를 가져올지 지정합니다. 사용할 수 있는 값은 다음과 같습니다:
DAY— 한 달 중 일(day)입니다. 가능한 값: 1–31.MONTH— 월을 나타내는 숫자입니다. 가능한 값: 1–12.YEAR— 연도입니다.SECOND— 초입니다. 가능한 값: 0–59.MINUTE— 분입니다. 가능한 값: 0–59.HOUR— 시입니다. 가능한 값: 0–23.
part 파라미터는 대소문자를 구분하지 않습니다.
date 파라미터는 처리할 날짜 또는 시간을 지정합니다. Date 형식과 DateTime 형식을 모두 지원합니다.
예시:
다음 예제에서는 테이블을 생성하고, 해당 테이블에 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로 변환됩니다.