WHERE 절을 사용하면 SELECT의 FROM 절에서 가져오는 데이터를 필터링할 수 있습니다.
WHERE 절이 있으면 그 뒤에는 UInt8 유형의 표현식이 와야 합니다.
이 표현식의 평가 결과가 0인 행은 이후 처리나 결과에서 제외됩니다.
WHERE 절 뒤의 표현식은 비교 및 논리 연산자, 또는 여러 일반 함수와 함께 자주 사용됩니다.
기반 테이블 엔진이 이를 지원하면 WHERE 표현식은 인덱스와 파티션 프루닝을 활용할 수 있도록 평가됩니다.
PREWHERE
PREWHERE라는 필터링 최적화도 있습니다.
Prewhere는 필터링을 더 효율적으로 적용하기 위한 최적화입니다.
PREWHERE 절을 명시적으로 지정하지 않아도 기본적으로 활성화됩니다.NULL 검사하기
NULL인지 확인해야 하는 경우 다음을 사용합니다:
IS NULL또는isNullIS NOT NULL또는isNotNull
NULL이 포함된 표현식은 절대 조건을 만족하지 않습니다.
논리 연산자를 사용한 데이터 필터링
WHERE 절과 함께 다음 논리 함수를 사용할 수 있습니다:
조건으로 UInt8 컬럼 사용하기
UInt8 컬럼을 불리언 조건으로 직접 사용할 수 있습니다. 이때 0은 false이고, 0이 아닌 모든 값(일반적으로 1)은 true입니다.
이에 대한 예시는 아래 섹션에 있습니다.
비교 연산자 사용
| 연산자 | 함수 | 설명 | 예시 |
|---|---|---|---|
a = b | equals(a, b) | 같음 | price = 100 |
a == b | equals(a, b) | 같음(대체 구문) | price == 100 |
a != b | notEquals(a, b) | 같지 않음 | category != 'Electronics' |
a <> b | notEquals(a, b) | 같지 않음(대체 구문) | category <> 'Electronics' |
a < b | less(a, b) | 작음 | price < 200 |
a <= b | lessOrEquals(a, b) | 작거나 같음 | price <= 200 |
a > b | greater(a, b) | 큼 | price > 500 |
a >= b | greaterOrEquals(a, b) | 크거나 같음 | price >= 500 |
a LIKE s | like(a, b) | 패턴 일치(대소문자 구분) | name LIKE '%top%' |
a NOT LIKE s | notLike(a, b) | 패턴 불일치(대소문자 구분) | name NOT LIKE '%top%' |
a ILIKE s | ilike(a, b) | 패턴 일치(대소문자 미구분) | name ILIKE '%LAPTOP%' |
a BETWEEN b AND c | a >= b AND a <= c | 범위 확인(경계값 포함) | price BETWEEN 100 AND 500 |
a NOT BETWEEN b AND c | a < b OR a > c | 범위 밖 확인 | price NOT BETWEEN 100 AND 500 |
패턴 매칭과 조건 표현식
WHERE 절에서 패턴 매칭과 조건 표현식을 사용할 수 있습니다.
| 기능 | 구문 | 대소문자 구분 | 성능 | 적합한 용도 |
|---|---|---|---|---|
LIKE | col LIKE '%pattern%' | 예 | 빠름 | 대소문자를 구분하는 정확한 패턴 매칭 |
ILIKE | col ILIKE '%pattern%' | 아니요 | 더 느림 | 대소문자를 구분하지 않는 검색 |
if() | if(cond, a, b) | 해당 없음 | 빠름 | 단순한 이진 조건 |
multiIf() | multiIf(c1, r1, c2, r2, def) | 해당 없음 | 빠름 | 여러 조건 |
CASE | CASE WHEN ... THEN ... END | 해당 없음 | 빠름 | SQL 표준 조건 처리 |
리터럴, 컬럼 또는 서브쿼리가 있는 표현식
WHERE 절 뒤에 오는 표현식에는 리터럴, 컬럼 또는 서브쿼리도 포함될 수 있습니다. 서브쿼리는 조건에 사용할 값을 반환하는 중첩된 SELECT SQL 문입니다.
| 유형 | 정의 | 평가 | 성능 | 예시 |
|---|---|---|---|---|
| 리터럴 | 고정된 상수 값 | 쿼리 작성 시점 | 가장 빠름 | WHERE price > 100 |
| 컬럼 | 테이블 데이터 참조 | 각 행마다 | 빠름 | WHERE price > cost |
| 서브쿼리 | 중첩된 SELECT | 쿼리 실행 시점 | 경우에 따라 다름 | WHERE id IN (SELECT ...) |
예시
NULL 검사하기
NULL 값이 포함된 쿼리:
논리 연산자를 사용한 데이터 필터링
AND - 두 조건이 모두 참이어야 합니다:
OR - 하나 이상의 조건이 참이어야 합니다:
NOT - 조건을 부정합니다:
XOR - 정확히 하나의 조건만 참이어야 합니다(둘 다 참이면 안 됨):
AND, OR, NOT, XOR)이 일반적으로 가독성이 더 좋지만, 함수 구문은 복잡한 표현식이나 동적 쿼리를 작성할 때 유용할 수 있습니다.
조건으로 UInt8 컬럼 사용하기
비교 연산자 사용
true에 대한 명시적 동등 비교(= 1 또는 = true):
false와 명시적으로 같음을 비교(= 0 또는 = false):
!= 0 또는 != false):
IN 연산자 사용:
아래 예시에서 (1, true)는 tuple입니다.