WHERE에 조건 하나만 쓰던 걸 넘어, AND·OR·BETWEEN·IN·LIKE·IS NULL을 써서 원하는 데이터를 정교하게 골라내는 법을 배워요. 필터가 손에 붙으면 SQL이 갑자기 강력해집니다.
BETWEEN으로 범위를(양 끝 포함), IN으로 목록을 간결하게 걸러요.LIKE의 %와 _ 패턴으로 문자열을 검색할 수 있어요.IS NULL / IS NOT NULL을 써요.지금까지 WHERE 뒤에 조건 하나만 썼다면, 이제 여러 조건을 논리 연산자로 연결해요. AND는 "둘 다 참", OR는 "하나라도 참", NOT은 "부정(뒤집기)"이에요.
=·>처럼 크기를 견주는 비교 연산자, 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 |
AND는 OR보다 먼저 계산돼요. 그래서 섞어 쓸 땐 괄호로 의도를 분명히 하는 게 안전해요.WHERE age < 20 OR age > 30 AND name = '철수' 는 사람 눈엔 헷갈려요.WHERE (age < 20 OR age > 30) AND name = '철수' 처럼 괄호로 묶어 원하는 순서를 강제하세요.
💡 헷갈리면 무조건 괄호. "먼저 묶을 조건"을 소괄호로 감싸면 실수가 확 줄어요.
AND로 이으면 결과가 점점 줄고, OR로 이으면 점점 늘어요. 이 감각만 잡아도 필터를 짤 때 방향이 잡혀요.age >= 20 AND age <= 29 처럼 범위를 쓸 때, BETWEEN을 쓰면 더 읽기 좋아요. 여기서 꼭 기억할 점 — 양 끝 값을 포함해요.
-- 나이가 20 이상 29 이하 (20과 29 모두 포함)
SELECT name, age
FROM users
WHERE age BETWEEN 20 AND 29;
| name | age | 결과 |
|---|---|---|
| '민지' | 19 | ✗ 제외 |
| '철수' | 20 | ✓ 포함 |
| '영희' | 25 | ✓ 포함 |
| '수현' | 29 | ✓ 포함 |
| '민수' | 30 | ✗ 제외 |
BETWEEN 20 AND 29는 age >= 20 AND age <= 29와 완전히 같아요. 즉 양 끝(20과 29)을 포함해요. "미만/초과"처럼 끝값을 빼고 싶다면 BETWEEN 대신 부등호(< · >)를 쓰세요.BETWEEN 작은값 AND 큰값 순서로 써요. BETWEEN 29 AND 20처럼 거꾸로 쓰면 아무것도 안 걸려요."철수 또는 영희 또는 민수"처럼 여러 값 중 하나를 고를 때, OR를 계속 이어 붙이면 길어져요. IN은 목록 안에 있으면 참이라 훨씬 간결해요.
-- 이름이 '철수' 또는 '영희'인 사람
SELECT name, age
FROM users
WHERE name IN ('철수', '영희');
WHERE name = '철수' OR name = '영희'WHERE name IN ('철수', '영희')
💡 값이 3개, 5개로 늘수록 IN의 간결함이 빛나요. 반대로 "목록에 없는 것"만 원하면 NOT IN (...)을 써요.
IN 안의 값은 쉼표로 구분하고, 문자열이면 작은따옴표로 감싸요('철수'). 숫자면 따옴표 없이 IN (20, 25, 30)처럼 써요.=는 정확히 일치할 때만 써요. "김씨 성을 가진 사람"처럼 일부만 맞으면 되는 검색엔 LIKE와 와일드카드(%, _)를 써요.
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는 끝이에요.
NULL은 "값이 없음(비어 있음)"을 뜻해요. 0이나 빈 문자열('')과는 달라요 — 아예 모름·미입력 상태예요. 중요한 건, 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을 쓰세요.| id | name | age | 결과 |
|---|---|---|---|
| 1 | '철수' | 20 | ✗ 제외 |
| 2 | '영희' | NULL | ✓ 포함 |
| 3 | '민수' | 30 | ✗ 제외 |
| 4 | '수현' | NULL | ✓ 포함 |
IS를 써요.BETWEEN A AND B = 범위, 양 끝(A·B) 포함. age BETWEEN 20 AND 29는 20과 29도 포함.IN (목록) = 목록 중 하나면 참. OR 여러 개를 간결하게 줄인 형태예요.LIKE 패턴 검색: % = 0글자 이상, _ = 정확히 1글자. '김%'·'%수'·'%마을%'.=로 비교 불가. IS NULL / IS NOT NULL을 써요.