논리 연산자 BETWEEN IN LIKE NULL 📝 문제풀이
◀ 이전 📋 목차 CH 05 ▶
🔎 CHAPTER 04 · 입문

연산자와 필터, 조건을 자유자재로

WHERE에 조건 하나만 쓰던 걸 넘어, AND·OR·BETWEEN·IN·LIKE·IS NULL을 써서 원하는 데이터를 정교하게 골라내는 법을 배워요. 필터가 손에 붙으면 SQL이 갑자기 강력해집니다.

🎯 이 장을 끝내면
🔗
논리 연산자
AND · OR · NOT으로 조건 조합하기
조건이 하나로 부족할 때, 여러 개를 논리적으로 엮어요.

지금까지 WHERE 뒤에 조건 하나만 썼다면, 이제 여러 조건을 논리 연산자로 연결해요. AND는 "둘 다 참", OR는 "하나라도 참", NOT은 "부정(뒤집기)"이에요.

🔤
연산자(operator) — 값끼리 비교하거나 조합할 때 쓰는 기호·키워드예요. =·>처럼 크기를 견주는 비교 연산자, AND·OR·NOT처럼 참·거짓을 엮는 논리 연산자가 대표예요.
-- 나이가 20 이상 이면서(AND) 30 미만인 사람
SELECT name, age
FROM users
WHERE age >= 20 AND age < 30;
연산자의미예시
AND둘 다 참일 때만age >= 20 AND age < 30
OR하나라도 참이면name = '철수' OR name = '영희'
NOT조건을 부정(뒤집기)NOT age > 30
🧮 괄호로 우선순위를 확실히 ANDOR보다 먼저 계산돼요. 그래서 섞어 쓸 땐 괄호로 의도를 분명히 하는 게 안전해요.
WHERE age < 20 OR age > 30 AND name = '철수' 는 사람 눈엔 헷갈려요.
WHERE (age < 20 OR age > 30) AND name = '철수' 처럼 괄호로 묶어 원하는 순서를 강제하세요. 💡 헷갈리면 무조건 괄호. "먼저 묶을 조건"을 소괄호로 감싸면 실수가 확 줄어요.
AND OR NOT 괄호 우선순위 WHERE
🧭
AND는 "좁히기", OR는 "넓히기". 조건을 AND로 이으면 결과가 점점 줄고, OR로 이으면 점점 늘어요. 이 감각만 잡아도 필터를 짤 때 방향이 잡혀요.
📏
BETWEEN
범위를 깔끔하게, BETWEEN A AND B
"몇부터 몇까지" 범위 조건을 한 줄로.

age >= 20 AND age <= 29 처럼 범위를 쓸 때, BETWEEN을 쓰면 더 읽기 좋아요. 여기서 꼭 기억할 점 — 양 끝 값을 포함해요.

-- 나이가 20 이상 29 이하 (20과 29 모두 포함)
SELECT name, age
FROM users
WHERE age BETWEEN 20 AND 29;
WHERE age BETWEEN 20 AND 29 → 20·29 포함
nameage결과
'민지'19✗ 제외
'철수'20✓ 포함
'영희'25✓ 포함
'수현'29✓ 포함
'민수'30✗ 제외
💡
BETWEEN 20 AND 29age >= 20 AND age <= 29완전히 같아요. 즉 양 끝(20과 29)을 포함해요. "미만/초과"처럼 끝값을 빼고 싶다면 BETWEEN 대신 부등호(< · >)를 쓰세요.
⚠️
순서 주의. BETWEEN 작은값 AND 큰값 순서로 써요. BETWEEN 29 AND 20처럼 거꾸로 쓰면 아무것도 안 걸려요.
📋
IN
여러 개 중 하나면 OK, IN (목록)
OR을 여러 번 쓰는 대신 목록으로 간결하게.

"철수 또는 영희 또는 민수"처럼 여러 값 중 하나를 고를 때, OR를 계속 이어 붙이면 길어져요. IN목록 안에 있으면 참이라 훨씬 간결해요.

-- 이름이 '철수' 또는 '영희'인 사람
SELECT name, age
FROM users
WHERE name IN ('철수', '영희');
🔁 IN은 OR의 축약형 아래 두 쿼리는 완전히 같은 뜻이에요.
WHERE name = '철수' OR name = '영희'
WHERE name IN ('철수', '영희') 💡 값이 3개, 5개로 늘수록 IN의 간결함이 빛나요. 반대로 "목록에 없는 것"만 원하면 NOT IN (...)을 써요.
🧭
IN 안의 값은 쉼표로 구분하고, 문자열이면 작은따옴표로 감싸요('철수'). 숫자면 따옴표 없이 IN (20, 25, 30)처럼 써요.
🔤
LIKE
패턴으로 문자열 검색, LIKE
"김으로 시작", "수로 끝", "마을 포함" 같은 검색.

=정확히 일치할 때만 써요. "김씨 성을 가진 사람"처럼 일부만 맞으면 되는 검색엔 LIKE와일드카드(%, _)를 써요.

🔤
와일드카드(wildcard) — "어떤 글자든 대신할 수 있는 만능 기호"예요. 카드 게임의 조커처럼요. LIKE와 함께 쓰는 %·_가 바로 그 만능 기호라, "정확히"가 아니라 "패턴만 맞으면" 되는 검색을 할 수 있어요.
-- 이름이 '김'으로 시작하는 사람
SELECT name FROM users WHERE name LIKE '김%';

-- 이름이 '수'로 끝나는 사람
SELECT name FROM users WHERE name LIKE '%수';

-- 이름에 '마을'이 들어가는 사람
SELECT name FROM users WHERE name LIKE '%마을%';
와일드카드의미패턴 예시매칭
%0글자 이상 아무거나'김%'김철수, 김영희, 김 (김으로 시작)
%끝·중간에도 사용'%수' / '%마을%'철수·민수 / 뒷마을·마을회관
_정확히 1글자'김_'김수·김철 (딱 2글자, 김+1글자)
🎯 % 와 _ 의 차이 % (퍼센트)0글자 이상 아무 문자. 길이에 제한이 없어요. '김%'은 "김", "김수", "김철수" 모두 매칭.
_ (밑줄)정확히 1글자. '김_'딱 2글자("김수"는 O, "김철수"는 X, "김"도 X)만 매칭. 💡 "몇 글자든"이면 %, "딱 몇 글자"면 _를 그 개수만큼. 이 둘만 구분하면 LIKE는 끝이에요.
LIKE % _ '김%' '%수' '%마을%'
🕳️
NULL
"값 없음" NULL 다루기
NULL은 =로 비교할 수 없어요. 특별한 문법이 필요해요.

NULL"값이 없음(비어 있음)"을 뜻해요. 0이나 빈 문자열('')과는 달라요 — 아예 모름·미입력 상태예요. 중요한 건, NULL은 =로 비교할 수 없다는 점이에요.

🔤
3값 논리(three-valued logic) — SQL의 조건 판단 결과는 참·거짓 둘만이 아니라 "알 수 없음(UNKNOWN)"까지 셋이에요. NULL은 "값을 모름"이라 age = NULL의 결과도 참도 거짓도 아닌 알 수 없음이 돼요. WHERE는 결과가 인 행만 남기니, 알 수 없음인 행은 절대 안 걸려요 — 그래서 IS NULL이 따로 필요해요.
-- ✗ 안 돼요: NULL은 = 로 비교 불가 (항상 결과가 안 나옴)
SELECT name FROM users WHERE age = NULL;

-- ✓ 올바른 방법: IS NULL / IS NOT NULL
SELECT name FROM users WHERE age IS NULL;      -- 나이가 없는 사람
SELECT name FROM users WHERE age IS NOT NULL;  -- 나이가 있는 사람
⚠️
age = NULL은 쓰면 안 돼요. NULL은 "알 수 없는 값"이라, = 비교의 결과 자체가 참도 거짓도 아닌 "알 수 없음"이 돼요. 그래서 항상 아무 행도 안 나와요. 반드시 IS NULL / IS NOT NULL을 쓰세요.
WHERE age IS NULL → 값이 비어 있는 행만
idnameage결과
1'철수'20✗ 제외
2'영희'NULL✓ 포함
3'민수'30✗ 제외
4'수현'NULL✓ 포함
💡
기억법 — "NULL은 같음(=)이 아니라 상태(IS)로 물어본다." "이 값이 비어 있니?"라고 존재 여부를 확인하는 거라 IS를 써요.
🧠 이 장 핵심 요약
📝
문제풀이 · 점검
배운 걸 가볍게 점검해봐요
시험이 아니라 "내가 이해했나" 확인용이에요. 틀려도 바로 해설이 나와요.
🧪
문제를 풀면 즉시 정답과 해설이 나오고, 위쪽 바에 점수가 쌓여요. 네 가지 유형(객관식 · O/X · 빈칸 · 쿼리결과)을 섞어 두었어요.
CH 05 📊 집계와 GROUP BY — COUNT·SUM·AVG로 데이터를 요약하고 그룹으로 묶기