모든 강의를 무료로 볼 수 있어요. 회원가입 없이도 학습 가능합니다.

5강 / 전체 8강

WHERE 조건

9분 읽기 조회 0

비교 연산자와 AND/OR/NOT으로 원하는 행을 정밀하게 필터링하고, BETWEEN·IN으로 범위와 목록 조건을 간결하게 작성합니다.

🎯 학습 목표

이 강을 마치면 WHERE 절로 전체 데이터에서 원하는 행만 정확하게 골라낼 수 있습니다. 숫자·문자열·날짜를 비교하는 다양한 연산자를 사용할 수 있고, AND·OR·NOT으로 여러 조건을 조합할 수 있습니다. 또한 범위 조건을 표현하는 BETWEEN과 목록 조건을 처리하는 IN을 활용해 복잡한 필터를 간결하게 작성할 수 있게 됩니다.

💡 WHERE 절이 필요한 이유

이 섹션에서는 WHERE가 왜 SQL의 핵심 기능인지 살펴보겠습니다.

실무 데이터베이스에는 수십만, 수백만 개의 행이 있습니다. SELECT * FROM orders처럼 전체를 가져오면 너무 많은 데이터가 반환되어 의미 있는 정보를 찾기 어렵고, 시스템 성능에도 영향을 줍니다. WHERE 절은 FROM으로 가져온 전체 행 중에서 특정 조건을 만족하는 행만 남기는 필터(Filter) 역할을 합니다.

예를 들어 "VIP 등급 회원만 보고 싶다", "2만 원 이상의 도서만 보고 싶다", "2024년 5월 이후 주문만 보고 싶다"는 요구사항을 WHERE로 표현합니다. WHERE는 SELECT 다음으로 가장 자주 쓰이는 절이며, 거의 모든 실무 쿼리에 등장합니다.

4강에서 배운 실행 순서를 다시 떠올려 봅니다. FROM → WHERE → SELECT 순서입니다. WHERE는 SELECT보다 먼저 실행되어 행을 걸러낸 뒤, 남은 행에서만 SELECT가 열을 선택합니다. 이 순서 때문에 WHERE 절에서는 SELECT에서 정의한 별칭을 쓸 수 없습니다.

⚖️ 비교 연산자

이 섹션에서는 WHERE 절에서 사용하는 기본 비교 연산자를 살펴보겠습니다.

비교 연산자는 두 값을 비교해서 참(TRUE) 또는 거짓(FALSE)을 반환합니다. WHERE 절은 이 결과가 TRUE인 행만 남깁니다.

연산자의미예시
=같다grade = 'VIP'
!= 또는 <>같지 않다status != 'CANCEL'
<작다price < 20000
<=작거나 같다price <= 20000
>크다price > 20000
>=크거나 같다price >= 20000

실습해 봅니다. VIP 등급 회원만 조회합니다.

SELECT name, email, grade
FROM members
WHERE grade = 'VIP';

결과에 김민준, 최유진 두 명만 나타납니다. 문자열 비교에는 작은따옴표를 씁니다. 큰따옴표를 쓰면 열 이름으로 해석되어 오류가 날 수 있으니 주의합니다.

가격이 20,000원 이상인 도서를 조회합니다.

SELECT title, price, category
FROM books
WHERE price >= 20000;

결과에 'SQL 첫걸음'(22,000원), '파이썬 독학'(28,000원), '클린 코드'(33,000원) 세 권이 나타납니다.

날짜도 문자열처럼 비교할 수 있습니다. SQLite에서 날짜를 'YYYY-MM-DD' 형식의 TEXT로 저장했으므로 사전 순(lexicographic) 비교가 날짜 순서와 일치합니다.

SELECT order_id, member_id, order_date, status
FROM orders
WHERE order_date >= '2024-05-01';

2024년 5월 1일 이후 주문 5건이 나타납니다.

🔗 AND · OR · NOT — 조건 조합

이 섹션에서는 여러 조건을 논리 연산자로 조합하는 방법을 살펴보겠습니다.

AND는 두 조건이 모두 참인 행만 남깁니다. 조건을 추가할수록 결과가 줄어듭니다.

SELECT title, price, category
FROM books
WHERE category = 'IT'
  AND price < 30000;

IT 카테고리이면서 3만 원 미만인 도서가 나타납니다. 'SQL 첫걸음'(22,000원), '파이썬 독학'(28,000원) 두 권입니다. '클린 코드'(33,000원)는 IT 카테고리지만 가격 조건을 만족하지 않아 제외됩니다.

OR는 두 조건 중 하나라도 참이면 행을 남깁니다. AND보다 결과가 많아집니다.

SELECT name, grade
FROM members
WHERE grade = 'VIP'
   OR grade = 'PREMIUM';

VIP 회원 2명(김민준, 최유진)과 PREMIUM 회원 1명(정하늘), 총 3명이 나타납니다.

NOT은 조건을 반전시킵니다. 조건이 거짓인 행만 남깁니다.

SELECT order_id, member_id, status
FROM orders
WHERE NOT status = 'DONE';

완료('DONE')가 아닌 주문, 즉 'CANCEL'과 'PENDING' 상태 주문이 나타납니다. NOT status = 'DONE'은 status != 'DONE'과 동일한 결과입니다. 보통 단순한 경우에는 !=을, 복잡한 표현을 반전할 때 NOT을 씁니다.

AND와 OR를 함께 쓸 때 우선순위에 주의해야 합니다. AND가 OR보다 먼저 처리됩니다. 의도한 대로 조건을 그룹화하려면 괄호를 씁니다.

-- 잘못된 예: AND가 먼저 처리되어 의도와 다를 수 있음
SELECT name, grade
FROM members
WHERE grade = 'VIP' OR grade = 'PREMIUM' AND join_date >= '2024-01-01';

-- 올바른 예: 괄호로 OR 조건을 먼저 그룹화
SELECT name, grade, join_date
FROM members
WHERE (grade = 'VIP' OR grade = 'PREMIUM')
  AND join_date >= '2024-01-01';

첫 번째 쿼리는 "PREMIUM이면서 2024년 이후 가입"과 "VIP 전체"를 합칩니다. 두 번째 쿼리는 "(VIP 또는 PREMIUM)이면서 2024년 이후 가입"이라는 의도를 정확히 표현합니다. 조건이 복잡해질수록 괄호를 명시적으로 쓰는 습관이 중요합니다.

📏 BETWEEN — 범위 조건

이 섹션에서는 범위 조건을 간결하게 표현하는 BETWEEN을 살펴보겠습니다.

숫자나 날짜의 범위를 조건으로 줄 때 >= 최솟값 AND <= 최댓값을 쓸 수 있지만, BETWEEN A AND B를 쓰면 더 읽기 쉽습니다. BETWEEN은 경계값을 포함합니다(inclusive).

SELECT title, price
FROM books
WHERE price BETWEEN 15000 AND 25000;

15,000원 이상 25,000원 이하인 도서가 나타납니다. '돈의 심리학'(17,000원), '채식주의자'(13,000원)—아, 13,000원은 범위 밖입니다. 실제 결과는 'SQL 첫걸음'(22,000원), '돈의 심리학'(17,000원), '82년생 김지영'(14,000원)—14,000원도 범위 안입니다. '부의 추월차선'(16,000원)도 포함됩니다.

이 쿼리는 아래와 완전히 동일한 결과를 냅니다.

SELECT title, price
FROM books
WHERE price >= 15000 AND price <= 25000;

날짜 범위에도 BETWEEN을 쓸 수 있습니다.

SELECT order_id, order_date, status
FROM orders
WHERE order_date BETWEEN '2024-04-01' AND '2024-04-30';

2024년 4월 한 달 동안의 주문이 조회됩니다. BETWEEN의 반대는 NOT BETWEEN으로 범위 밖의 행을 가져옵니다.

📋 IN — 목록 조건

이 섹션에서는 여러 값 중 하나와 일치하는 행을 찾는 IN을 살펴보겠습니다.

특정 열의 값이 여러 후보 중 하나인 행을 찾을 때, OR을 여러 번 쓰는 대신 IN을 쓰면 훨씬 간결합니다.

-- OR을 여러 번 쓰는 방법 (장황함)
SELECT name, grade
FROM members
WHERE grade = 'VIP' OR grade = 'PREMIUM';

-- IN으로 간결하게 표현
SELECT name, grade
FROM members
WHERE grade IN ('VIP', 'PREMIUM');

두 쿼리는 동일한 결과를 반환합니다. IN 안에 값이 많아질수록 OR 방식보다 IN이 훨씬 읽기 쉽습니다.

카테고리가 IT 또는 경제인 도서를 조회합니다.

SELECT title, category, price
FROM books
WHERE category IN ('IT', '경제');

IT 3권(SQL 첫걸음, 파이썬 독학, 클린 코드)과 경제 2권(돈의 심리학, 부의 추월차선) 총 5권이 나타납니다.

특정 회원의 주문 내역을 조회할 때도 IN이 유용합니다.

SELECT order_id, member_id, order_date
FROM orders
WHERE member_id IN (1, 3, 5);

1번, 3번, 5번 회원의 주문만 조회됩니다. IN의 반대는 NOT IN입니다. 특정 상태를 제외한 주문을 볼 때 유용합니다.

SELECT order_id, status
FROM orders
WHERE status NOT IN ('CANCEL');

취소된 주문을 제외한 완료·대기 주문이 나타납니다.

📝 핵심 요약

이번 강에서 배운 내용을 정리하겠습니다.

문법역할예시
WHERE 조건조건을 만족하는 행만 반환WHERE price >= 20000
=, !=, <, <=, >, >=값 비교 연산자WHERE grade = 'VIP'
AND두 조건 모두 참인 행WHERE category = 'IT' AND price < 30000
OR둘 중 하나라도 참인 행WHERE grade = 'VIP' OR grade = 'PREMIUM'
NOT조건 반전WHERE NOT status = 'DONE'
BETWEEN A AND BA 이상 B 이하 (경계 포함)WHERE price BETWEEN 15000 AND 25000
IN (값1, 값2, ...)목록 중 하나와 일치WHERE category IN ('IT', '경제')

WHERE는 데이터를 의미 있게 만드는 핵심 도구입니다. 전체 데이터에서 원하는 부분만 정확히 추출하는 능력이 SQL 실력의 기본입니다. 다음 6강에서는 문자열 패턴 검색(LIKE)과 빈 값(NULL) 처리를 다룹니다. "이름에 '김'이 들어간 회원", "이메일을 등록하지 않은 고객" 같은 현실적인 조건을 SQL로 표현하는 방법을 배웁니다.

관련 주제

  • WHERE 절
  • 비교 연산자
  • AND OR NOT
  • BETWEEN
  • IN 연산자
  • 개발·프로그래밍
  • 개발·프로그래밍 강의
  • SQL·데이터베이스 입문 24강
  • 무료강의
  • 무료 온라인 강의
  • NUGUNA
  • 누구나

📚 시리즈 전체 공유

SQL·데이터베이스 입문 24강

이 강의가 속한 시리즈는 총 8강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.

댓글

0/1000

불러오는 중...