CertNote/ 출퇴근 학습 노트
로드맵
SQLD · 개발자SQL 개발자 (SQLD)
  • Week 1
    • 1.데이터 모델링 개요
    • 2.3단계 스키마와 모델링 단계
    • 3.엔터티
    • 4.속성
    • 5.관계
  • Week 2
  • Week 3
    • 1.관계형 DB 와 SELECT
    • 2.문자·숫자 함수
    • 3.날짜·변환 함수
    • 4.NULL 함수와 CASE·DECODE
    • 5.WHERE 절
  • Week 4
  • Week 5
  • Week 6
  • Week 7
  • Week 8
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← SQLD/Week 3/Day 5

기준: SQLD 출제 기준·오류 제보

SQLD· AssociateWeek 3 · Day 5읽기 약 5분
핵심 정리
  • BETWEEN a AND b 는 a 와 b 를 포함한다. a 가 b 보다 크면 한 행도 안 나온다.
  • LIKE 의 % 는 0글자 이상, _ 는 정확히 한 글자다. 이 기호 자체를 찾을 때는 ESCAPE 로 표시 문자를 정한다.
  • NULL 은 = 로 못 찾는다. IS NULL / IS NOT NULL 만 쓴다.
  • 논리 연산자 우선순위는 NOT > AND > OR 다. 헷갈리면 괄호를 친다.
  • NOT IN (…) 목록에 NULL 이 하나라도 있으면 결과는 0행이다.

Day 5 - WHERE 절

WHERE 는 행을 고른다

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

범위와 목록 — BETWEEN, IN

BETWEEN a AND b

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 (목록)

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

패턴 검색 — LIKE

기호뜻예걸리는 이름
%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' 과 같다.

ESCAPE — %, _ 자체를 찾을 때

_ 를 글자 그대로 찾고 싶어도 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 은 IS NULL 로만 찾는다

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 IN 의 함정

긍정부정
=<>, !=, ^=, NOT 컬럼 =
BETWEEN a AND bNOT BETWEEN a AND b
IN (…)NOT IN (…)
LIKENOT LIKE
IS 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 순이다.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

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; ```

문제 2

다음 SQL 의 결과에 포함되지 않는 사원은? ```sql SELECT ENAME FROM EMP WHERE ENAME LIKE '_A%'; ```

문제 3

다음 WHERE 절과 같은 의미의 조건은? ```sql SELECT ENAME FROM EMP WHERE JOB = 'SALESMAN' OR JOB = 'MANAGER' AND SAL > 2900; ```

문제 4

다음 SQL 의 결과로 알맞은 것은? (EMP 의 MGR 컬럼에는 7566, 7698, 7782, 7788, 7839, 7902 와 NULL 이 들어 있다) ```sql SELECT COUNT(*) FROM EMP WHERE MGR NOT IN (7698, 7839, NULL); ```

문제 5

COMM 이 NULL 인 사원을 올바르게 조회하는 조건은?

이전NULL 함수와 CASE·DECODEWeek 3 · Day 4다음 GROUP BY 와 집계 함수Week 4 · Day 1

참고 공식 자료

  • SQLD 공식 출제 기준(새 탭에서 열림)

이 페이지

  • WHERE 는 행을 고른다
  • 범위와 목록 — BETWEEN, IN
  • BETWEEN a AND b
  • IN (목록)
  • 패턴 검색 — LIKE
  • ESCAPE — %, _ 자체를 찾을 때
  • NULL 은 IS NULL 로만 찾는다
  • 논리 연산자와 우선순위
  • 부정 연산자와 NOT IN 의 함정
  • 용어
  • 연습 문제