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 조건을 예로 들 수 있다.