SELECT 가 열을 고른다면 WHERE 는 행을 고른다. 조건이 참(TRUE) 인 행만 결과에 남는다.
SELECT ENAME, SAL FROM EMP WHERE SAL >= 3000 ; 실습장에서 실행하고 고쳐 보기
ENAME SAL
---------- ----------
SCOTT 3000
KING 5000
FORD 3000
연산자 뜻 =같다 >, >=, <, <=크다, 크거나 같다, 작다, 작거나 같다 <>, !=, ^=같지 않다 (셋 다 같은 뜻)
문자와 날짜 값은 작은따옴표로 감싼다. 문자 값은 대소문자를 가린다.
'clerk' 로는 CLERK 를 못 찾는다. 결과가 0행이다.
SELECT COUNT ( * ) FROM EMP WHERE JOB = 'clerk' ; 실습장에서 실행하고 고쳐 보기
COUNT(*)
----------
0
a <= 값 AND 값 <= b 와 같다. 양 끝값이 포함된다.
SELECT ENAME, SAL FROM EMP WHERE SAL BETWEEN 1250 AND 1600 ; 실습장에서 실행하고 고쳐 보기
ENAME SAL
---------- ----------
ALLEN 1600
WARD 1250
MARTIN 1250
TURNER 1500
MILLER 1300
1250 인 WARD·MARTIN, 1600 인 ALLEN 이 모두 들어갔다.
작은 값을 앞에 써야 한다. BETWEEN 1600 AND 1250 은 SAL >= 1600 AND SAL <= 1250 이라 참이 될 수 없다.
SELECT COUNT ( * ) FROM EMP WHERE SAL BETWEEN 1600 AND 1250 ; 실습장에서 실행하고 고쳐 보기
COUNT(*)
----------
0
NOT BETWEEN 은 범위 밖, 즉 값 < a OR 값 > b 다. BETWEEN 은 날짜에도 쓸 수 있다. HIREDATE BETWEEN DATE '1982-01-01' AND DATE '1987-12-31' 은 MILLER·SCOTT·ADAMS 세 명을 고른다.
IN 은 = 조건을 OR 로 이은 것과 같다. DEPTNO IN (10, 40) 은 DEPTNO = 10 OR DEPTNO = 40 이다.
SELECT ENAME, DEPTNO FROM EMP WHERE DEPTNO IN ( 10 , 40 ); 실습장에서 실행하고 고쳐 보기
ENAME DEPTNO
---------- ----------
CLARK 10
KING 10
MILLER 10
40번 부서에는 사원이 없어 10번 부서 세 명만 나온다. 목록에 없는 값이 섞여도 오류는 아니다.
여러 컬럼을 묶어 짝으로 비교할 수도 있다. (직무, 부서) 짝이 목록 안의 짝과 똑같아야 한다.
SELECT ENAME, JOB, DEPTNO FROM EMP WHERE (JOB, DEPTNO) IN (( 'MANAGER' , 20 ), ( 'CLERK' , 30 )); 실습장에서 실행하고 고쳐 보기
ENAME JOB DEPTNO
---------- --------- ----------
JONES MANAGER 20
JAMES CLERK 30
기호 뜻 예 걸리는 이름 %0글자 이상 아무 문자열 'J%'J 로 시작 _정확히 한 글자 '_A%'두 번째 글자가 A 조합 '%S'S 로 끝남 조합 '____'정확히 네 글자
SELECT ENAME FROM EMP WHERE ENAME LIKE '_A%' ; 실습장에서 실행하고 고쳐 보기
ENAME
----------
WARD
MARTIN
JAMES
LIKE 도 대소문자를 가린다. LIKE 'k%' 는 KING 을 찾지 못한다.
와일드카드 없이 LIKE 'KING' 이라고 쓰면 = 'KING' 과 같다.
_ 를 글자 그대로 찾고 싶어도 LIKE '%_%' 는 "한 글자 이상인 모든 문자열"이라는 뜻이 된다. ESCAPE 로 표시 문자를 정하고, 그 문자 바로 뒤의 _·% 를 일반 글자로 읽게 한다.
SELECT 'OK' R FROM DUAL WHERE 'SALES_2026' LIKE '%\_%' ESCAPE '\' ; 실습장에서 실행하고 고쳐 보기
R
--
OK
SELECT COUNT ( * ) FROM DUAL WHERE 'SALES2026' LIKE '%\_%' ESCAPE '\' ; 실습장에서 실행하고 고쳐 보기
COUNT(*)
----------
0
밑줄이 없는 SALES2026 은 걸리지 않는다. ESCAPE 없이 '%_%' 로 썼다면 걸렸을 값이다.
표시 문자는 아무 글자나 정할 수 있다. '50%' LIKE '%#%' ESCAPE '#' 는 % 로 끝나는 문자열을 찾는다.
NULL 과 무엇을 비교하든 결과는 참도 거짓도 아닌 UNKNOWN 이다. WHERE 는 참인 행만 남기므로 UNKNOWN 인 행은 빠진다.
⚠️ COMM = NULL 은 오류가 아니라 0행이다. 문법은 맞아서 실행은 되지만, 어떤 행도 참이 되지 않는다. NULL 을 찾을 때는 반드시 IS NULL, 아닌 것은 IS NOT NULL 을 쓴다.
SELECT COUNT ( * ) FROM EMP WHERE COMM = NULL ; 실습장에서 실행하고 고쳐 보기
COUNT(*)
----------
0
SELECT ENAME, COMM FROM EMP WHERE COMM IS NOT NULL ; 실습장에서 실행하고 고쳐 보기
ENAME COMM
---------- ----------
ALLEN 300
WARD 500
MARTIN 1400
TURNER 0
같은 이유로 부정 조건에서도 NULL 행은 빠진다. COMM <> 300 에 COMM 이 NULL 인 10명은 들어가지 않는다.
SELECT ENAME, COMM FROM EMP WHERE COMM <> 300 ; 실습장에서 실행하고 고쳐 보기
ENAME COMM
---------- ----------
WARD 500
MARTIN 1400
TURNER 0
연산자 참이 되는 때 우선순위 NOT조건이 거짓일 때 1 (가장 먼저) AND두 조건이 모두 참일 때 2 OR하나라도 참일 때 3
괄호가 없으면 AND 가 OR 보다 먼저 묶인다.
SELECT ENAME, JOB, SAL FROM EMP WHERE JOB = 'SALESMAN' OR JOB = 'MANAGER' AND SAL > 2900 ; 실습장에서 실행하고 고쳐 보기
ENAME JOB SAL
---------- --------- ----------
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
TURNER SALESMAN 1500
실제로는 JOB = 'SALESMAN' OR (JOB = 'MANAGER' AND SAL > 2900) 으로 읽힌다. 그래서 급여가 낮은 SALESMAN 네 명이 모두 나왔다.
"SALESMAN 이나 MANAGER 중 급여가 2900 초과"를 원했다면 괄호로 OR 을 먼저 묶는다.
SELECT ENAME, JOB, SAL FROM EMP WHERE (JOB = 'SALESMAN' OR JOB = 'MANAGER' ) AND SAL > 2900 ; 실습장에서 실행하고 고쳐 보기
ENAME JOB SAL
---------- --------- ----------
JONES MANAGER 2975
NULL 이 끼면 결과 TRUE AND UNKNOWNUNKNOWN FALSE AND UNKNOWNFALSE TRUE OR UNKNOWNTRUE FALSE OR UNKNOWNUNKNOWN NOT UNKNOWNUNKNOWN
긍정 부정 =<>, !=, ^=, NOT 컬럼 =BETWEEN a AND bNOT BETWEEN a AND bIN (…)NOT IN (…)LIKENOT LIKEIS NULLIS NOT NULL
NOT IN (a, b) 은 컬럼 <> a AND 컬럼 <> b 다. 목록에 NULL 이 있으면 컬럼 <> NULL 이 UNKNOWN 이 되고, AND 로 이었으므로 전체가 참이 될 수 없다.
SELECT COUNT ( * ) FROM EMP WHERE MGR NOT IN ( 7698 , 7839 , NULL ); 실습장에서 실행하고 고쳐 보기
COUNT(*)
----------
0
반대로 IN 은 OR 로 이어지므로 NULL 이 섞여도 나머지 값으로 정상 검색된다.
SELECT ENAME, MGR FROM EMP WHERE MGR IN ( 7566 , NULL ); 실습장에서 실행하고 고쳐 보기
ENAME MGR
---------- ----------
SCOTT 7566
FORD 7566
이 함정은 서브쿼리에서 더 눈에 안 띈다. KING 의 MGR 이 NULL 이라, "아무의 관리자도 아닌 사원"을 찾는 아래 SQL 은 0 을 돌려준다.
SELECT COUNT ( * ) FROM EMP WHERE EMPNO NOT IN ( SELECT MGR FROM EMP); 실습장에서 실행하고 고쳐 보기
COUNT(*)
----------
0
서브쿼리 결과에서 NULL 을 빼면 기대한 8명이 나온다. 서브쿼리는 5주차에 다시 본다.
SELECT COUNT ( * ) FROM EMP WHERE EMPNO NOT IN ( SELECT MGR FROM EMP WHERE MGR IS NOT NULL ); 실습장에서 실행하고 고쳐 보기
COUNT(*)
----------
8
상위 N개 행만 고르는 ROWNUM 도 WHERE 절에 쓰지만, 동작이 독특해 6주차 Top N 쿼리에서 다룬다.
다음 주에는 행을 묶어 집계하는 GROUP BY 와 집계 함수로 넘어간다.
WHERE 절 : 조건이 참인 행만 결과에 남기는 절.
BETWEEN : 두 값 사이의 범위 조건. 양 끝값을 포함한다.
IN : 목록 중 하나와 같은지 보는 조건. = 를 OR 로 이은 것과 같다.
와일드카드 : LIKE 에서 아무 글자를 뜻하는 기호. % 는 0글자 이상, _ 는 한 글자다.
ESCAPE : LIKE 에서 %·_ 를 일반 글자로 읽게 하는 표시 문자를 정하는 구문.
UNKNOWN : NULL 과 비교했을 때 나오는 세 번째 논리값. WHERE 에서는 거짓처럼 걸러진다.
연산자 우선순위 : 괄호가 없을 때 먼저 계산되는 순서. NOT, AND, OR 순이다.
📝 연습 문제 선택지를 클릭하면 정답·해설이 펼쳐집니다.
EMP 테이블의 급여가 아래와 같을 때 다음 SQL 의 결과로 알맞은 것은? (ALLEN 1600, WARD 1250, MARTIN 1250, TURNER 1500, MILLER 1300, ADAMS 1100, 나머지는 1600 초과이거나 1100 미만)
```sql
SELECT COUNT(*) FROM EMP WHERE SAL BETWEEN 1250 AND 1600;
```
다음 SQL 의 결과에 포함되지 않는 사원은?
```sql
SELECT ENAME FROM EMP WHERE ENAME LIKE '_A%';
```
다음 WHERE 절과 같은 의미의 조건은?
```sql
SELECT ENAME FROM EMP WHERE JOB = 'SALESMAN' OR JOB = 'MANAGER' AND SAL > 2900;
```
A JOB = 'SALESMAN' OR (JOB = 'MANAGER' AND SAL > 2900)B (JOB = 'SALESMAN' OR JOB = 'MANAGER') AND SAL > 2900C (JOB = 'SALESMAN' AND SAL > 2900) OR JOB = 'MANAGER'D JOB IN ('SALESMAN', 'MANAGER') AND SAL > 2900다음 SQL 의 결과로 알맞은 것은? (EMP 의 MGR 컬럼에는 7566, 7698, 7782, 7788, 7839, 7902 와 NULL 이 들어 있다)
```sql
SELECT COUNT(*) FROM EMP WHERE MGR NOT IN (7698, 7839, NULL);
```
COMM 이 NULL 인 사원을 올바르게 조회하는 조건은?
A WHERE COMM IS NULLB WHERE COMM = NULLC WHERE COMM = ''D WHERE COMM IN (NULL)