Skip to main content
Summary

WHERE는 장부의 검색칸이다

테이블 전체를 보는 일은 엑셀 파일 전체를 여는 것과 비슷합니다. 처음에는 괜찮지만, 데이터가 많아지면 원하는 행을 찾기 어렵습니다. 이때 사용하는 것이 WHERE입니다.

WHERE는 큰 장부에서 조건에 맞는 줄만 남기는 필터입니다. 고객 명단에서 서울 고객만 보기, 주문 내역에서 10만 원 이상 주문만 보기, 상품 목록에서 재고가 부족한 상품만 보기처럼 업무에서 자주 쓰입니다.

이번 장에서는 한 테이블 안에서 조건을 거는 방법을 연습합니다. 예시는 다음과 같은 monthly_customer_sales 테이블을 사용하겠습니다.

컬럼뜻예시
customer_id고객 번호101
customer_name고객명김민지
city지역서울
sales_month매출 월2026-05-01
purchase_amount월 구매금액150000
membership_level회원 등급VIP
memo메모재구매 가능성 높음
phone전화번호010-1234-5678

조건으로 데이터를 찾는 필터링 기술AI 생성 이미지

비교 연산자로 한 가지 조건 걸기

가장 기본은 값을 비교하는 조건입니다. 엑셀 필터에서 특정 값만 고르거나, 숫자가 얼마 이상인 행만 남기는 것과 같습니다.

자주 쓰는 비교 연산자는 다음과 같습니다.

연산자뜻예시
=같다city = '서울'
<>같지 않다city <> '서울'
>크다purchase_amount > 100000
>=크거나 같다purchase_amount >= 100000
<작다purchase_amount < 100000
<=작거나 같다purchase_amount <= 100000

하고 싶은 말: 서울에 사는 고객만 보고 싶다.

SELECT customer_id, customer_name, city, purchase_amount
FROM monthly_customer_sales
WHERE city = '서울';

결과 해석: city 값이 서울인 행만 남습니다. 부산, 대전, 인천 고객은 결과에서 빠집니다.

하고 싶은 말: 월 구매금액이 10만 원 이상인 고객만 보고 싶다.

SELECT customer_id, customer_name, city, purchase_amount
FROM monthly_customer_sales
WHERE purchase_amount >= 100000;

결과 해석: purchase_amount가 100000보다 크거나 같은 고객만 조회됩니다. 숫자는 보통 작은따옴표 없이 씁니다. 반대로 서울, VIP 같은 문자는 작은따옴표로 감쌉니다.

AND와 OR로 조건을 함께 쓰기

업무 질문은 보통 조건이 하나로 끝나지 않습니다. 예를 들어 서울 고객이면서 구매금액이 10만 원 이상인 사람을 찾고 싶을 수 있습니다.

AND는 조건을 모두 만족해야 한다는 뜻입니다. 장부에 필터를 두 개 걸고, 둘 다 통과한 행만 남기는 방식입니다.

하고 싶은 말: 서울 고객 중 월 구매금액이 10만 원 이상인 사람만 보고 싶다.

SELECT customer_id, customer_name, city, purchase_amount
FROM monthly_customer_sales
WHERE city = '서울'
  AND purchase_amount >= 100000;

결과 해석: 지역이 서울이어야 하고, 동시에 구매금액도 10만 원 이상이어야 합니다. 서울이지만 5만 원만 구매한 고객은 빠지고, 20만 원을 구매했지만 부산 고객인 경우도 빠집니다.

OR는 조건 중 하나만 만족해도 된다는 뜻입니다.

하고 싶은 말: 서울 또는 부산 고객을 보고 싶다.

SELECT customer_id, customer_name, city, purchase_amount
FROM monthly_customer_sales
WHERE city = '서울'
   OR city = '부산';

결과 해석: city가 서울인 행과 부산인 행이 함께 나옵니다. 둘 중 하나만 맞으면 결과에 포함됩니다.

IN으로 여러 값 중 하나 찾기

OR 조건이 많아지면 SQL이 길어집니다. 이때는 IN을 쓰면 읽기 쉽습니다.

하고 싶은 말: 서울, 부산, 대전 고객을 한 번에 보고 싶다.

SELECT customer_id, customer_name, city, purchase_amount
FROM monthly_customer_sales
WHERE city IN ('서울', '부산', '대전');

결과 해석: city 값이 괄호 안 목록 중 하나인 행만 나옵니다. 아래 문장과 같은 의미입니다.

WHERE city = '서울'
   OR city = '부산'
   OR city = '대전'

업무에서는 회원 등급, 주문 상태, 지역처럼 정해진 값 중 몇 개를 고를 때 IN을 자주 씁니다.

하고 싶은 말: VIP 또는 GOLD 회원만 보고 싶다.

SELECT customer_id, customer_name, membership_level, purchase_amount
FROM monthly_customer_sales
WHERE membership_level IN ('VIP', 'GOLD');

결과 해석: 회원 등급이 VIP이거나 GOLD인 고객만 조회됩니다.

BETWEEN으로 기간과 범위 찾기

BETWEEN은 어떤 값이 시작과 끝 사이에 있는지 확인합니다. 숫자 범위나 날짜 범위를 찾을 때 편합니다.

하고 싶은 말: 구매금액이 5만 원 이상 20만 원 이하인 고객을 보고 싶다.

SELECT customer_id, customer_name, purchase_amount
FROM monthly_customer_sales
WHERE purchase_amount BETWEEN 50000 AND 200000;

결과 해석: 50000과 200000도 포함됩니다. 즉 >= 50000 그리고 <= 200000과 같은 뜻입니다.

날짜에도 사용할 수 있습니다. 오늘이 2026년 6월이라고 할 때, 지난달인 2026년 5월 데이터를 찾는 예를 보겠습니다.

하고 싶은 말: 2026년 5월 매출 데이터만 보고 싶다.

SELECT customer_id, customer_name, sales_month, purchase_amount
FROM monthly_customer_sales
WHERE sales_month BETWEEN DATE '2026-05-01' AND DATE '2026-05-31';

결과 해석: sales_month가 2026년 5월 1일부터 2026년 5월 31일 사이인 행만 나옵니다. sales_month처럼 날짜만 들어 있는 컬럼이라면 이렇게 써도 이해하기 쉽습니다.

단, 날짜와 시간이 함께 들어 있는 컬럼이라면 끝 날짜를 조심해야 합니다. 2026-05-31 15:30:00 같은 값이 있을 수 있기 때문입니다. 이럴 때는 다음 달 1일 전까지로 쓰는 방식이 더 안전합니다.

이번에는 월별 요약 테이블이 아니라 주문 원장 테이블인 customer_orders에 order_time이라는 주문 시간이 있다고 가정해 보겠습니다.

하고 싶은 말: 주문 시간이 2026년 5월에 속한 주문만 보고 싶다.

SELECT customer_id, customer_name, order_time, purchase_amount
FROM customer_orders
WHERE order_time >= TIMESTAMP '2026-05-01 00:00:00'
  AND order_time <  TIMESTAMP '2026-06-01 00:00:00';

결과 해석: 5월 1일 0시부터 6월 1일 0시 직전까지의 주문만 나옵니다. 날짜와 시간이 함께 있는 실무 데이터에서는 이 방식이 실수를 줄여 줍니다.

LIKE로 이름과 문구 패턴 찾기

정확히 같은 값이 아니라, 특정 글자로 시작하거나 특정 단어가 들어간 값을 찾고 싶을 때는 LIKE를 씁니다.

LIKE에서 %는 글자가 몇 개든 올 수 있다는 뜻입니다.

조건뜻
LIKE '김%'김으로 시작
LIKE '%전자%'전자라는 단어가 포함
LIKE '%문의'문의로 끝남

하고 싶은 말: 이름이 김으로 시작하는 고객을 보고 싶다.

SELECT customer_id, customer_name, city
FROM monthly_customer_sales
WHERE customer_name LIKE '김%';

결과 해석: 김민지, 김철수처럼 이름이 김으로 시작하는 고객이 나옵니다.

하고 싶은 말: 메모에 재구매라는 단어가 들어간 고객을 찾고 싶다.

SELECT customer_id, customer_name, memo
FROM monthly_customer_sales
WHERE memo LIKE '%재구매%';

결과 해석: 메모 앞뒤에 어떤 글자가 있든, 중간에 재구매라는 단어가 들어 있으면 결과에 포함됩니다.

PostgreSQL에서 LIKE는 기본적으로 대소문자를 구분합니다. 영문 데이터에서 대소문자를 무시하고 찾고 싶다면 ILIKE를 사용할 수 있습니다.

IS NULL로 비어 있는 값 찾기

업무 데이터에서 비어 있다는 말은 하나가 아닙니다. 다음 세 가지는 서로 다릅니다.

값뜻
NULL아직 값이 없거나 모름
0숫자 0이라는 값이 있음
''빈 문자열이라는 값이 있음

예를 들어 구매금액이 0인 고객은 구매하지 않았다는 기록이 있는 고객입니다. 반면 구매금액이 NULL이면 아직 확인되지 않았거나 입력되지 않았다는 뜻일 수 있습니다. 전화번호가 NULL이면 전화번호를 모른다는 뜻이고, 전화번호가 빈 문자열 ''이면 입력칸은 있었지만 아무 글자도 넣지 않은 상태일 수 있습니다.

NULL은 =로 찾지 않습니다. 반드시 IS NULL을 씁니다.

하고 싶은 말: 전화번호가 입력되지 않은 고객을 찾고 싶다.

SELECT customer_id, customer_name, phone
FROM monthly_customer_sales
WHERE phone IS NULL;

결과 해석: phone 값이 NULL인 행만 나옵니다. phone = NULL이라고 쓰면 원하는 결과가 나오지 않습니다.

하고 싶은 말: 전화번호가 NULL이 아닌 고객만 보고 싶다.

SELECT customer_id, customer_name, phone
FROM monthly_customer_sales
WHERE phone IS NOT NULL;

결과 해석: 전화번호가 NULL이 아닌 고객만 나옵니다. 다만 빈 문자열 ''은 NULL이 아니므로 이 결과에 포함될 수 있습니다. 그래서 데이터에 따라 "비어 있지 않다"와 "NULL이 아니다"는 같은 말이 아닐 수 있습니다.

하고 싶은 말: 전화번호가 NULL도 아니고 빈 문자열도 아닌 고객만 보고 싶다.

SELECT customer_id, customer_name, phone
FROM monthly_customer_sales
WHERE phone IS NOT NULL
  AND phone <> '';

결과 해석: 전화번호가 아예 없거나, 빈 문자열로만 저장된 행을 제외합니다. 실무에서 입력 누락을 찾을 때는 NULL과 빈 문자열을 함께 확인해야 하는 경우가 많습니다.

하고 싶은 말: 구매금액이 정확히 0원인 고객을 보고 싶다.

SELECT customer_id, customer_name, purchase_amount
FROM monthly_customer_sales
WHERE purchase_amount = 0;

결과 해석: 값이 비어 있는 고객이 아니라, 구매금액이 0이라고 기록된 고객만 조회됩니다.

괄호로 조건의 의도를 분명하게 만들기

조건이 복잡해지면 AND와 OR가 섞입니다. 이때 괄호를 쓰지 않으면 내가 생각한 조건과 다르게 조회될 수 있습니다.

다음 문장을 보겠습니다.

하고 싶은 말: 서울 또는 부산 고객 중에서 구매금액이 10만 원 이상인 사람을 보고 싶다.

잘못 읽힐 수 있는 SQL입니다.

SELECT customer_id, customer_name, city, purchase_amount
FROM monthly_customer_sales
WHERE city = '서울'
   OR city = '부산'
  AND purchase_amount >= 100000;

이 문장은 사람이 보기에는 그럴듯하지만, SQL은 AND를 먼저 처리합니다. 그래서 실제로는 다음처럼 해석됩니다.

WHERE city = '서울'
   OR (city = '부산' AND purchase_amount >= 100000)

즉 서울 고객은 구매금액과 상관없이 모두 나올 수 있습니다.

의도대로 쓰려면 괄호를 넣습니다.

SELECT customer_id, customer_name, city, purchase_amount
FROM monthly_customer_sales
WHERE (city = '서울' OR city = '부산')
  AND purchase_amount >= 100000;

결과 해석: 먼저 서울 또는 부산 고객을 고르고, 그중에서 구매금액이 10만 원 이상인 행만 남깁니다. 조건이 조금이라도 헷갈리면 괄호를 쓰는 습관이 안전합니다.

업무 질문을 SQL로 바꾸기

이제 이번 장의 핵심 질문을 SQL로 바꿔 보겠습니다.

하고 싶은 말: 지난달 서울 고객 중 구매금액이 10만 원 이상인 사람을 구매금액이 큰 순서로 보고 싶다.

SELECT customer_id, customer_name, city, sales_month, purchase_amount
FROM monthly_customer_sales
WHERE city = '서울'
  AND sales_month BETWEEN DATE '2026-05-01' AND DATE '2026-05-31'
  AND purchase_amount >= 100000
ORDER BY purchase_amount DESC;

결과 해석: 서울 고객만 남기고, 2026년 5월 데이터만 남기고, 구매금액이 10만 원 이상인 행만 남깁니다. 마지막으로 구매금액이 큰 고객부터 보여 줍니다.

이 문장은 길어 보이지만 한 줄씩 읽으면 어렵지 않습니다.

  • SELECT: 어떤 컬럼을 볼 것인가

  • FROM: 어느 테이블에서 가져올 것인가

  • WHERE: 어떤 조건의 행만 남길 것인가

  • ORDER BY: 어떤 순서로 보여 줄 것인가

필터 조건을 쓸 때의 점검 순서

조건 검색이 잘 안 될 때는 SQL 전체를 의심하기보다 아래 순서로 확인하면 됩니다.

  1. 문자 값에 작은따옴표를 붙였는가?

  2. 숫자 조건에 불필요한 따옴표를 붙이지 않았는가?

  3. NULL을 찾을 때 IS NULL을 사용했는가?

  4. NULL과 빈 문자열 ''을 헷갈리고 있지는 않은가?

  5. AND와 OR가 섞인 곳에 괄호가 필요한가?

  6. 날짜 컬럼에 시간이 포함되어 있지는 않은가?

  7. 여러 값 중 하나를 찾는 조건이라면 IN으로 더 읽기 쉽게 바꿀 수 있는가?

WHERE를 잘 쓰면 데이터베이스는 거대한 장부가 아니라 필요한 답을 빠르게 찾아 주는 검색 도구가 됩니다. 처음에는 조건 하나로 시작하고, 그다음 AND, OR, IN, BETWEEN, LIKE, IS NULL을 하나씩 붙이면 됩니다. 중요한 것은 SQL을 외우는 것이 아니라, 업무 질문을 작은 조건으로 나누어 쓰는 습관입니다.

책 목록

비개발자를 위한 PostgreSQL 입문: 업무 데이터를 안전하게 다루는 가장 쉬운 방법

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기