WHERE 조건식과 연산자
비교·BETWEEN·IN·LIKE·IS NULL과 AND·OR·NOT 우선순위를 결과 집합 관점에서 익힌다.
핵심 요약
비교·BETWEEN·IN·LIKE·IS NULL과 AND·OR·NOT 우선순위를 결과 집합 관점에서 익힌다.
핵심 질문
- WHERE 조건식과 연산자에서 반드시 구분해야 할 개념과 결과 규칙은 무엇인가?
- 0건·1건·여러 건과 NULL·동점·중복 데이터에서 결과가 어떻게 달라지는가?
- 비슷해 보이는 문법과 결과가 같아지는 조건, 달라지는 조건은 무엇인가?
- 작은 샘플 데이터를 이용해 결과를 실수 없이 예측하는 순서는 무엇인가?
학습 목표
- 주요 조건 연산자의 경계와 NULL 동작을 설명한다.
- 복합 조건을 괄호로 명확하게 작성한다.
개념 지도
FROM에서 행 집합 생성 → WHERE 행 필터 → GROUP/HAVING → SELECT → ORDER BY
핵심 내용
BETWEEN a AND b는 일반적으로 양 끝값을 포함한다. IN은 여러 등치 조건의 집합이며, LIKE에서 %는 길이 0개 이상, _는 정확히 한 문자를 뜻한다. NULL은 IS NULL, IS NOT NULL로 검사한다.
WHERE order_dt >= DATE '2026-07-01'
AND order_dt < DATE '2026-08-01'
AND status IN ('PAID', 'SHIPPED')
시간까지 저장된 날짜 컬럼을 하루 범위로 조회할 때 BETWEEN 00:00:00 AND 00:00:00 형태는 마지막 날의 대부분을 빠뜨릴 수 있다. 시작 이상, 다음 경계 미만의 반개방 구간이 안전하다.
논리 연산자의 일반 우선순위는 NOT → AND → OR다. 의도가 섞인 조건은 괄호로 직접 표현한다.
WHERE region = 'SEOUL'
AND (grade = 'A' OR vip_yn = 'Y')
흔한 오해와 주의점
BETWEEN은 경계를 포함하지만 날짜의 시간 부분까지 자동으로 하루 끝으로 바꿔주지 않는다.NOT IN과 NULL 조합은 UNKNOWN을 만들 수 있다.- 선두 와일드카드
LIKE '%ABC'는 문자열의 끝이ABC인 값을 찾는 조건이다.
문항 풀이 보강: 조건의 경계와 NULL
문자 컬럼으로 년, 월이 따로 저장되어 있으면 다음처럼 연도와 월을 독립된 BETWEEN으로 비교해서는 연도 경계를 올바르게 표현할 수 없다.
-- 잘못된 접근
WHERE year BETWEEN '2014' AND '2015'
AND month BETWEEN '11' AND '03'
201411처럼 비교 가능한 하나의 키로 만들거나 날짜로 변환해 시작 이상·종료 미만을 사용한다.
WHERE sale_month >= '201411'
AND sale_month <= '201503'
LIKE, IN, BETWEEN과 일반 비교에서도 NULL 결과는 UNKNOWN이다. IS NOT NULL은 NULL이 아닌 행을 찾는 올바른 표준 조건이다.
논리 연산은 괄호를 먼저, 그다음 NOT → AND → OR 순서로 평가한다. 결과 건수 문제에서는 각 행마다 조건을 TRUE·FALSE·UNKNOWN으로 표시하면 실수를 줄일 수 있다.
3값 논리로 조건 계산하기
SQL 조건 결과는 TRUE·FALSE뿐 아니라 UNKNOWN이 있다.
| 식 | 값이 10 | 값이 20 | 값이 NULL |
|---|---|---|---|
col = 10 | TRUE | FALSE | UNKNOWN |
col <> 10 | FALSE | TRUE | UNKNOWN |
col IS NULL | FALSE | FALSE | TRUE |
col IN (10,20) | TRUE | TRUE | UNKNOWN |
WHERE는 TRUE인 행만 남긴다. UNKNOWN은 FALSE와 마찬가지로 결과에서 제외되지만 논리 조합에서는 차이를 만든다.
연산자별 점검표
| 연산자 | 핵심 경계 | 자주 나는 오류 |
|---|---|---|
BETWEEN | 양 끝 포함 | DATE의 마지막 날 시간 누락 |
LIKE 'ABC%' | 접두어 범위 | %ABC는 시작점 탐색 어려움 |
IN | 여러 등치 후보 | NULL이 섞인 NOT IN 오해 |
AND/OR | NOT→AND→OR | 괄호 누락으로 조건 의미 변경 |
날짜 반개구간
WHERE created_at >= TIMESTAMP '2026-07-27 00:00:00'
AND created_at < TIMESTAMP '2026-07-28 00:00:00'
23:59:59를 직접 만들면 Fractional Second를 빠뜨릴 수 있다. 시작 이상·다음 경계 미만은 DATE와 TIMESTAMP 모두에서 안전하다.
조건식 작성 원칙
조건식을 바꿀 때는 NULL 처리, 문자 정렬 규칙, 날짜의 시간 부분과 경계 포함 여부가 동일한지 먼저 검증한다.
결과를 검증하는 순서
- 각 Query Block이 만드는 한 행의 의미를 먼저 적습니다.
- 조건을 적용하기 전 원본 행과 적용 후 남는 행을 작은 표로 그립니다.
- NULL 비교가
TRUE,FALSE,UNKNOWN중 무엇인지 구분합니다. - 중복 제거, 그룹화, 정렬과 행 제한이 적용되는 순서를 확인합니다.
- 데이터가 0건·1건·여러 건일 때도 같은 규칙이 성립하는지 검증합니다.
실무와 시험에서 함께 확인할 항목
ORDER BY가 없다면 결과 순서를 가정하지 않습니다.- 문자열·숫자·날짜 비교에서는 데이터 타입과 명시적 형변환을 확인합니다.
- 같은 결과처럼 보이는 SQL도 NULL과 중복이 있을 때 달라질 수 있습니다.
- 문법을 외우기 전에 샘플 데이터 3~5행으로 결과를 직접 계산합니다.
마지막 점검
- 작성 순서가 아니라 SQL의 논리적 처리 순서로 결과를 계산합니다.
- NULL을 0이나 빈 값과 같은 것으로 취급하지 않습니다.
ORDER BY가 없는 결과 순서와 DISTINCT 없는 중복 제거를 가정하지 않습니다.- 비슷한 문법은 0건·다건·NULL 데이터를 넣어 결과가 정말 같은지 확인합니다.
복습 문제
A OR B AND C에서 먼저 평가되는 연산은?- 7월 전체 DATE 값을 안전하게 조회하는 경계 조건은?
- 샘플 데이터 3행으로 결과를 직접 계산할 수 있는가?
- NULL이 포함될 때 결과가 달라지는 지점은 어디인가?