← 개념서모바일 버전
2과목 · SQL 기본 및 활용·6

WHERE 절

비교·논리·SQL 표준 조건 연산자, NULL 비교, 연산자 우선순위까지 WHERE 전 영역을 다룹니다.

1. WHERE의 역할

WHERE는 FROM이 돌려준 행 집합에서 원하는 행만 남기는 필터입니다. 평가 순서상 SELECT보다 먼저 실행되며, SELECT에서 만든 별칭은 사용할 수 없습니다.

-- 불가: WHERE는 SELECT보다 먼저 실행
SELECT salary * 1.1 AS new_sal FROM emp WHERE new_sal > 5000000;  -- 오류
SELECT salary * 1.1 AS new_sal FROM emp WHERE salary * 1.1 > 5000000; -- 정상

2. 비교 연산자

연산자 의미
= 같다
<>, != 다르다
<, <=, >, >= 대소 비교

3. 논리 연산자

연산자 의미
AND 모두 참
OR 하나라도 참
NOT 부정

우선순위

NOT > AND > OR 순서. 복잡한 조건은 괄호로 명시해야 안전.

-- 실수: OR가 AND보다 약해서 아래 두 쿼리는 의미가 다르다
SELECT * FROM emp WHERE dept_id = 10 OR dept_id = 20 AND job = 'CLERK';
-- 해석: dept_id=10 OR (dept_id=20 AND job='CLERK')

SELECT * FROM emp WHERE (dept_id = 10 OR dept_id = 20) AND job = 'CLERK';
-- 이쪽이 의도적

4. SQL 표준 조건 연산자

BETWEEN ... AND

SELECT * FROM emp WHERE salary BETWEEN 3000000 AND 5000000;
-- 3000000 <= salary <= 5000000 (양끝 포함)

IN (값 목록)

SELECT * FROM emp WHERE dept_id IN (10, 20, 30);
SELECT * FROM emp WHERE dept_id NOT IN (10, 20);

IN은 OR 체인을 간결하게 표현하는 문법적 설탕입니다.

LIKE — 패턴 매칭

와일드카드 의미
% 0개 이상의 임의 문자
_ 정확히 1개의 임의 문자
SELECT * FROM emp WHERE name LIKE '김%';     -- 김으로 시작
SELECT * FROM emp WHERE name LIKE '_개발';    -- '?개발' (? 한 글자)
SELECT * FROM emp WHERE name LIKE '%\_bot%' ESCAPE '\'; -- '_' 자체를 찾음

IS NULL / IS NOT NULL

SELECT * FROM emp WHERE bonus IS NULL;
SELECT * FROM emp WHERE bonus IS NOT NULL;
-- WHERE bonus = NULL 은 항상 UNKNOWN → 결과 0건

EXISTS / NOT EXISTS

서브쿼리의 결과 존재 여부만 확인.

SELECT * FROM emp e
WHERE EXISTS (
  SELECT 1 FROM dept d WHERE d.dept_id = e.dept_id AND d.active = 'Y'
);

5. 문자열 비교의 함정

  • 문자열은 공백도 글자. 'A''A '는 다른 값일 수 있음(타입에 따라).
  • Oracle CHAR는 고정 길이라 비교 시 공백 패딩됨. VARCHAR2는 있는 그대로.
  • 한글 정렬은 DBMS 로케일에 따라 결과가 다를 수 있음.

6. 성능 팁 — Sargable 조건

WHERE 조건이 인덱스를 타려면 컬럼에 함수/연산을 씌우지 않아야 합니다.

-- ❌ 인덱스 사용 불가
WHERE SUBSTR(phone, 1, 3) = '010';

-- ✅ 인덱스 사용 가능
WHERE phone LIKE '010%';

-- ❌ 좌변에 연산
WHERE salary * 12 >= 60000000;

-- ✅ 우변으로 이동
WHERE salary >= 5000000;

7. 자주 출제되는 포인트

  • BETWEEN A AND B양끝 포함.
  • LIKE '%\_%' ESCAPE '\' 같은 ESCAPE 절.
  • 연산자 우선순위: NOT > AND > OR.
  • IN (…)= OR의 설탕, NOT IN서브쿼리에 NULL이 있으면 결과가 0건이 될 수 있음.
  • EXISTS는 존재 여부만 보므로 SELECT 내용이 성능에 영향을 주지 않음.

8. 요약 체크리스트

  • WHERE와 SELECT의 평가 순서 차이를 안다.
  • BETWEEN / IN / LIKE / IS NULL / EXISTS 사용 예를 쓸 수 있다.
  • 연산자 우선순위(NOT > AND > OR)를 답할 수 있다.
  • NOT IN과 NULL의 함정을 설명할 수 있다.
  • 인덱스를 타게 하는 Sargable 조건을 예로 들 수 있다.