WHERE 절과 연산자
쉽게 말하면
WHERE는 조건에 맞는 줄만 골라내는 체예요. '급여가 300 이상', '이름이 김으로 시작' 같은 조건을 적으면 그 조건을 통과한 줄만 남아요. 조건을 여러 개 쓰면 NOT, AND, OR 순서로 먼저 계산하고, NULL은 =로 비교하면 통과하지 못해요.
시험용 정의
WHERE 절은 FROM으로 읽은 행 중에서 조건이 참인 행만 남긴다. 비교 연산자(=, <>, >, <=), SQL 연산자(BETWEEN, IN, LIKE, IS NULL), 논리 연산자(NOT · AND · OR, 이 순서로 먼저 계산)로 조건을 만든다. 조건 결과가 거짓이거나 알 수 없음(NULL 비교)인 행은 빠진다.
비유로 이해하기
체 거르기다. FROM으로 쏟아 부은 행 중에서 구멍(조건)을 통과한 행만 아래로 떨어진다. NULL은 통과 여부를 모르는 덩어리라 체 위에 남는다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 조건식 | 참·거짓·알 수 없음 중 하나로 판정되는 식. sal > 3000 |
| 와일드카드 | LIKE에서 여러 글자를 대신하는 기호. % 는 0글자 이상, _ 는 정확히 한 글자 |
| 연산자 우선순위 | 여러 연산자가 섞일 때 먼저 계산하는 순서. 괄호가 가장 먼저 |
연산자
| 연산자 | 뜻 | 예 |
|---|---|---|
| =, <> (!=, ^=) | 같다, 같지 않다 | deptno = 20, job <> 'DEV' |
| >, >=, <, <= | 크기 비교 (문자·날짜도 됨) | sal >= 3000 |
| BETWEEN a AND b | a 이상 b 이하 (양 끝 포함) | sal BETWEEN 2500 AND 3000 |
| IN (목록) | 목록 중 하나와 같다 | deptno IN (10, 30) |
| LIKE '패턴' | % 0글자 이상, _ 한 글자 | ename LIKE 'K%', ename LIKE '_I%' |
| IS NULL / IS NOT NULL | NULL인지 확인 (= NULL은 안 됨) | comm IS NULL |
| NOT BETWEEN, NOT IN, NOT LIKE | 부정 | deptno NOT IN (10, 20) |
논리 연산자 우선순위
괄호 → NOT → AND → OR 순서로 계산한다. 비교 연산자와 SQL 연산자는 논리 연산자보다 먼저다.
NULL이 섞이면 세 가지 값(참·거짓·알 수 없음) 논리가 된다. 거짓 AND 알 수 없음 = 거짓, 참 OR 알 수 없음 = 참, 나머지 조합은 알 수 없음이다.
NOT IN과 NULL 함정
deptno NOT IN (10, NULL)은 deptno <> 10 AND deptno <> NULL과 같다. 뒤쪽이 항상 알 수 없음이라 어떤 행도 나오지 않는다. 반면 IN (10, NULL)은 = 10 OR = NULL이라 10인 행은 나온다.
시험에 이렇게 나와요
- 논리 연산자 우선순위 NOT → AND → OR 로 결과 행 고르기
- BETWEEN 양 끝 포함, LIKE % 와 _ 의미, ESCAPE
- NULL 비교는 IS NULL, = NULL 은 결과 없음
- NOT IN 목록에 NULL이 있으면 결과 0행
- WHERE에서 SELECT 별칭·집계 함수는 쓸 수 없음
출제 범위·공식 안내 기반
확인 문제
Q1. WHERE job = 'DEV' OR job = 'SALES' AND sal >= 3000은 어떻게 해석될까요?
- (DEV 또는 SALES) 이면서 급여 3000 이상
- 오류가 난다
- DEV이면서 SALES
- DEV 전체 + (SALES 이면서 급여 3000 이상)
정답 보기
4번 DEV 전체 + (SALES 이면서 급여 3000 이상)
AND가 OR보다 먼저 계산된다. 그래서 job = 'DEV' OR (job = 'SALES' AND sal >= 3000)이 된다. 의도가 다르면 괄호를 쳐야 한다.
Q2. WHERE ename LIKE '_A%'에 맞는 이름은?
- CHOI
- KANG
- OH
- LEE
정답 보기
2번 KANG
_ 가 첫 글자 하나, 그다음이 A여야 한다. K-A-NG은 두 번째 글자가 A라 맞다. % 는 뒤에 몇 글자가 와도 된다.
Q3. WHERE deptno NOT IN (10, NULL)의 결과는?
- 오류
- 10번 부서를 뺀 모든 행
- 결과 없음
- 10번 부서 행만
정답 보기
3번 결과 없음
<> NULL 비교가 항상 알 수 없음이라 AND로 묶인 전체가 참이 될 수 없다.
Q4. sal BETWEEN 3000 AND 2500의 결과는?
- 결과 없음
- 2500~3000 사이 행
- 3000과 2500인 행
- 오류
정답 보기
1번 결과 없음
sal >= 3000 AND sal <= 2500 이라 참이 될 수 없다. 작은 값을 앞에 쓴다.
Q5. WHERE deptno = 10 OR deptno = 20 AND sal > 3000 의 뜻은?
- 오류
- 10번 또는 20번 부서이면서 급여 3000 초과
- 10번 부서 전체, 또는 20번 부서이면서 급여 3000 초과
- 10번 부서이면서 급여 3000 초과
정답 보기
3번 10번 부서 전체, 또는 20번 부서이면서 급여 3000 초과
AND가 OR보다 먼저 계산된다. 두 번째 뜻을 원하면 괄호로 묶는다.
Q6. LIKE 'A\_%' ESCAPE '\' 가 찾는 것은?
- 두 번째 글자가 A인 문자열
- A_로 시작하는 문자열
- A로 시작하는 모든 문자열
- A로 끝나는 문자열
정답 보기
2번 A_로 시작하는 문자열
ESCAPE 문자 뒤의 _는 아무 한 글자가 아니라 밑줄 글자 자체다.
헷갈리기 쉬운 O·X
OR가 AND보다 먼저 계산된다.
정답 보기
X NOT → AND → OR 순서다.
WHERE comm <> 0은 COMM이 NULL인 행을 포함하지 않는다.
정답 보기
O NULL과의 비교는 알 수 없음이라 걸러진다.
LIKE의 _ 는 0글자 이상을 뜻한다.
정답 보기
X _ 는 정확히 한 글자, % 가 0글자 이상이다.