이미지 로딩 중...
AI Generated
2025. 11. 22. · 2 Views
SQL WHERE 절과 조건 필터링 완벽 가이드
데이터베이스에서 원하는 데이터만 정확하게 찾아내는 WHERE 절의 모든 것을 배워봅니다. 기본 비교 연산자부터 BETWEEN, IN, LIKE, NULL 처리까지 실무에서 바로 사용할 수 있는 예제와 함께 쉽게 설명합니다.
목차
- WHERE 절 기본 사용법
- 비교 연산자 (=, !=, >, <, >=, <=)
- BETWEEN으로 범위 조건
- IN으로 여러 값 매칭
- LIKE 패턴 매칭 (%와 _)
- NULL 값 처리 (IS NULL, IS NOT NULL)
1. WHERE 절 기본 사용법
시작하며
여러분이 수천 명의 회원 정보가 담긴 데이터베이스에서 특정 지역에 사는 회원만 찾아야 하는 상황을 겪어본 적 있나요? 모든 데이터를 하나하나 확인하는 것은 불가능에 가깝습니다.
이런 문제는 실제 개발 현장에서 매일 발생합니다. 전체 데이터 중에서 필요한 것만 골라내지 못하면 성능도 떨어지고, 원하는 결과를 얻는 데 시간도 오래 걸립니다.
바로 이럴 때 필요한 것이 WHERE 절입니다. WHERE 절은 마치 필터와 같아서, 여러분이 원하는 조건에 맞는 데이터만 쏙쏙 골라내줍니다.
개요
간단히 말해서, WHERE 절은 SELECT 문에서 특정 조건을 만족하는 행만 조회하도록 필터링하는 역할을 합니다. 데이터베이스는 마치 거대한 창고와 같습니다.
이 창고에서 "빨간색 상자"만 찾고 싶다면 어떻게 해야 할까요? WHERE 절이 바로 그 역할을 해줍니다.
예를 들어, 특정 날짜에 가입한 회원만 찾거나, 특정 금액 이상 구매한 고객을 찾는 경우에 매우 유용합니다. 전통적으로 프로그래밍 언어에서 모든 데이터를 가져온 후 반복문으로 필터링했다면, 이제는 데이터베이스 단에서 WHERE 절로 필요한 데이터만 가져올 수 있습니다.
WHERE 절의 핵심 특징은 조건식을 사용한다는 점과, 데이터베이스 레벨에서 필터링하여 네트워크 전송량을 줄인다는 점입니다. 이러한 특징들이 애플리케이션의 성능을 크게 향상시킵니다.
코드 예제
-- 기본 WHERE 절 사용 예제
-- users 테이블에서 나이가 25세인 사용자 조회
SELECT user_id, name, age, email
FROM users
WHERE age = 25;
-- 특정 도시에 거주하는 사용자 조회
SELECT name, city, phone
FROM users
WHERE city = 'Seoul';
-- 활성 상태인 사용자만 조회
SELECT user_id, name, status
FROM users
WHERE status = 'active';
설명
이것이 하는 일: WHERE 절은 SELECT 문과 함께 사용되어 전체 데이터 중에서 조건을 만족하는 행만 결과로 반환합니다. 첫 번째로, SELECT 다음에 조회하고 싶은 컬럼들을 나열합니다.
그 다음 FROM으로 어떤 테이블에서 데이터를 가져올지 지정합니다. 이렇게 하면 기본적으로 모든 행이 조회됩니다.
그 다음으로, WHERE 절이 실행되면서 각 행을 하나씩 검사합니다. 데이터베이스 엔진은 WHERE 다음에 오는 조건식을 평가하여 TRUE인 행만 결과에 포함시킵니다.
마지막으로, 조건을 만족하는 행들만 모아서 최종 결과 집합을 만들어냅니다. 예를 들어 "age = 25"라는 조건이 있다면, 나이가 25세인 사용자의 행만 선택되어 반환됩니다.
여러분이 이 코드를 사용하면 불필요한 데이터 전송을 줄이고, 애플리케이션 메모리 사용량을 절약하며, 쿼리 성능을 크게 향상시킬 수 있습니다. 특히 대용량 데이터를 다룰 때 WHERE 절의 효과는 더욱 두드러집니다.
실전 팁
💡 WHERE 절은 항상 FROM 절 뒤에 위치해야 합니다. 순서가 바뀌면 문법 오류가 발생합니다.
💡 문자열 비교 시에는 반드시 작은따옴표('')를 사용하세요. 큰따옴표는 데이터베이스에 따라 다르게 해석될 수 있습니다.
💡 WHERE 절 없이 UPDATE나 DELETE를 실행하면 모든 데이터가 변경되거나 삭제되므로 매우 주의해야 합니다.
💡 인덱스가 설정된 컬럼을 WHERE 절에 사용하면 쿼리 성능이 크게 향상됩니다.
💡 WHERE 절에서 함수를 사용하면 인덱스를 활용하지 못할 수 있으니, 가능하면 컬럼을 직접 비교하세요.
2. 비교 연산자 (=, !=, >, <, >=, <=)
시작하며
여러분이 쇼핑몰을 운영하면서 "10만원 이상 구매한 고객"이나 "재고가 10개 미만인 상품"을 찾아야 하는 상황을 겪어본 적 있나요? 단순히 같은지만 확인하는 것으로는 부족합니다.
이런 문제는 실제 비즈니스 로직에서 핵심적입니다. 범위를 지정하거나, 크기를 비교하거나, 특정 값이 아닌 것을 찾는 등의 다양한 조건이 필요합니다.
바로 이럴 때 필요한 것이 비교 연산자입니다. 비교 연산자를 사용하면 같음, 다름, 크고 작음을 자유롭게 표현할 수 있습니다.
개요
간단히 말해서, 비교 연산자는 두 값을 비교하여 조건의 참/거짓을 판단하는 기호입니다. 실무에서는 단순히 값이 같은지 확인하는 것 이상이 필요합니다.
예를 들어, 특정 금액 이상의 주문을 찾거나, 특정 날짜 이전에 등록된 데이터를 조회하거나, 특정 값이 아닌 모든 경우를 찾아야 할 때가 많습니다. 기존에는 모든 데이터를 가져와서 프로그래밍 코드로 필터링했다면, 이제는 SQL의 비교 연산자로 데이터베이스에서 직접 필터링할 수 있습니다.
비교 연산자의 핵심 특징은 여섯 가지 기본 연산자(=, !=, >, <, >=, <=)를 제공한다는 점과, 숫자, 문자열, 날짜 등 다양한 데이터 타입에 사용할 수 있다는 점입니다. 이러한 특징들이 복잡한 비즈니스 로직을 간단한 SQL로 표현할 수 있게 해줍니다.
코드 예제
-- 비교 연산자 사용 예제
-- 같음: 가격이 정확히 50000원인 상품
SELECT product_name, price
FROM products
WHERE price = 50000;
-- 같지 않음: 상태가 'pending'이 아닌 주문
SELECT order_id, status
FROM orders
WHERE status != 'pending';
-- 크다: 재고가 100개보다 많은 상품
SELECT product_name, stock
FROM products
WHERE stock > 100;
-- 작거나 같음: 나이가 30세 이하인 회원
SELECT name, age
FROM members
WHERE age <= 30;
설명
이것이 하는 일: 비교 연산자는 WHERE 절에서 컬럼의 값과 비교할 값을 평가하여 TRUE 또는 FALSE를 반환합니다. 첫 번째로, 등호(=) 연산자는 정확히 일치하는 값을 찾습니다.
예를 들어 "price = 50000"은 가격이 정확히 50000원인 행만 선택합니다. 이는 가장 기본적이면서도 자주 사용되는 연산자입니다.
그 다음으로, 부등호(!=, <>) 연산자는 같지 않은 값을 찾습니다. "status != 'pending'"은 대기 상태가 아닌 모든 주문을 조회합니다.
내부적으로는 각 행의 status 컬럼 값이 'pending'과 다른지 검사합니다. 크기 비교 연산자(>, <, >=, <=)는 숫자, 날짜, 문자열의 대소를 비교합니다.
"stock > 100"은 재고가 100보다 큰 상품을 찾고, "age <= 30"은 나이가 30 이하인 회원을 찾습니다. 날짜의 경우 더 최근 날짜가 더 큰 값으로 취급됩니다.
여러분이 이 연산자들을 사용하면 복잡한 필터링 로직을 간단하게 표현할 수 있고, 데이터베이스 최적화 엔진이 인덱스를 활용하여 빠르게 검색할 수 있습니다. 특히 숫자나 날짜 범위를 다룰 때 매우 효율적입니다.
실전 팁
💡 부등호는 !=와 <> 두 가지 표기법이 있지만, !=가 더 널리 사용되고 가독성이 좋습니다.
💡 문자열 비교는 대소문자를 구분합니다. 대소문자 구분 없이 비교하려면 UPPER()나 LOWER() 함수를 사용하세요.
💡 NULL 값은 모든 비교 연산자에서 FALSE를 반환합니다. NULL 비교는 IS NULL을 사용해야 합니다.
💡 날짜 비교 시에는 날짜 형식을 정확히 맞춰야 합니다. 문자열로 비교하면 예상치 못한 결과가 나올 수 있습니다.
💡 부동소수점 숫자 비교 시에는 정확한 일치(=) 대신 범위 비교(BETWEEN)를 사용하는 것이 안전합니다.
3. BETWEEN으로 범위 조건
시작하며
여러분이 "2023년 1월부터 3월까지의 매출 데이터"나 "가격이 10000원에서 50000원 사이인 상품"을 찾아야 하는 상황을 겪어본 적 있나요? >= 와 <= 를 동시에 사용하면 코드가 길어지고 복잡해집니다.
이런 문제는 실무에서 매우 자주 발생합니다. 날짜 범위, 가격 범위, 나이대 등 두 값 사이의 데이터를 조회하는 것은 거의 모든 애플리케이션에서 필요한 기능입니다.
바로 이럴 때 필요한 것이 BETWEEN 연산자입니다. BETWEEN을 사용하면 범위 조건을 간결하고 읽기 쉽게 표현할 수 있습니다.
개요
간단히 말해서, BETWEEN 연산자는 특정 값이 두 값 사이에 있는지 확인하는 범위 비교 연산자입니다. 왜 이 연산자가 필요한지 실무 관점에서 설명하면, 범위 조건은 비즈니스 로직에서 매우 흔합니다.
예를 들어, 특정 기간의 판매 실적을 분석하거나, 일정 가격대의 상품을 필터링하거나, 특정 연령대의 고객을 타겟팅하는 경우에 매우 유용합니다. 기존에는 "price >= 10000 AND price <= 50000"처럼 두 개의 조건을 AND로 연결했다면, 이제는 "price BETWEEN 10000 AND 50000"으로 간결하게 표현할 수 있습니다.
BETWEEN의 핵심 특징은 양쪽 끝값을 포함한다는 점(이상, 이하)과, 숫자, 날짜, 문자열 모두에 사용할 수 있다는 점입니다. 이러한 특징들이 코드의 가독성을 높이고 실수를 줄여줍니다.
코드 예제
-- BETWEEN 연산자 사용 예제
-- 가격이 10000원에서 50000원 사이인 상품 조회
SELECT product_name, price
FROM products
WHERE price BETWEEN 10000 AND 50000;
-- 2023년 1월부터 3월까지 가입한 회원 조회
SELECT user_id, name, join_date
FROM users
WHERE join_date BETWEEN '2023-01-01' AND '2023-03-31';
-- 나이가 20세에서 30세 사이인 회원 조회
SELECT name, age, email
FROM members
WHERE age BETWEEN 20 AND 30;
-- NOT BETWEEN: 범위 밖의 값 조회
SELECT product_name, stock
FROM products
WHERE stock NOT BETWEEN 10 AND 100;
설명
이것이 하는 일: BETWEEN 연산자는 컬럼 값이 지정된 두 값 사이에 있는지 검사하여 범위 내에 있으면 TRUE를 반환합니다. 첫 번째로, BETWEEN 다음에 하한값을 지정합니다.
예를 들어 "price BETWEEN 10000 AND 50000"에서 10000이 최소값입니다. 이 값은 범위에 포함됩니다(이상).
그 다음으로, AND 키워드 다음에 상한값을 지정합니다. 위 예제에서 50000이 최대값입니다.
이 값도 범위에 포함됩니다(이하). 데이터베이스는 "price >= 10000 AND price <= 50000"과 동일하게 해석합니다.
마지막으로, 각 행의 컬럼 값이 이 범위 안에 있는지 검사하여 조건을 만족하는 행만 결과에 포함시킵니다. NOT BETWEEN을 사용하면 범위 밖의 값을 찾을 수 있습니다.
여러분이 이 연산자를 사용하면 코드 가독성이 향상되고, 범위 조건의 의도를 명확하게 표현할 수 있으며, AND 연산자를 중복해서 사용하는 것보다 실수할 가능성이 줄어듭니다. 특히 날짜 범위 쿼리에서 매우 유용합니다.
실전 팁
💡 BETWEEN은 양쪽 값을 모두 포함합니다(이상, 이하). 한쪽만 포함하려면 >= 또는 <=를 사용하세요.
💡 하한값이 상한값보다 크면 결과가 비어 나옵니다. 항상 작은 값을 먼저 써야 합니다.
💡 날짜 범위 조회 시 시간까지 고려해야 합니다. '2023-03-31'은 00:00:00을 의미하므로 하루 전체를 포함하려면 '2023-03-31 23:59:59'를 사용하세요.
💡 문자열에도 BETWEEN을 사용할 수 있습니다. 알파벳 순서로 비교되므로 'A' BETWEEN 'A' AND 'C'는 'A', 'B', 'C'로 시작하는 값을 포함합니다.
💡 인덱스가 있는 컬럼에 BETWEEN을 사용하면 Range Scan으로 최적화되어 성능이 매우 좋습니다.
4. IN으로 여러 값 매칭
시작하며
여러분이 "서울, 부산, 대구에 사는 회원"이나 "pending, processing, shipped 상태인 주문"을 찾아야 하는 상황을 겪어본 적 있나요? OR 연산자를 여러 번 반복하면 쿼리가 매우 길어지고 관리하기 어려워집니다.
이런 문제는 실제 개발에서 자주 발생합니다. 특정 목록에 포함된 값들을 찾는 것은 필터링의 기본이지만, 값이 많아질수록 SQL이 복잡해지고 유지보수가 힘들어집니다.
바로 이럴 때 필요한 것이 IN 연산자입니다. IN을 사용하면 여러 값을 목록으로 나열하여 간결하게 조건을 표현할 수 있습니다.
개요
간단히 말해서, IN 연산자는 컬럼 값이 지정된 값 목록 중 하나와 일치하는지 확인하는 연산자입니다. 실무에서는 여러 카테고리의 상품을 조회하거나, 특정 상태 목록의 주문을 찾거나, 여러 지역의 매출을 분석하는 등의 작업이 매우 흔합니다.
예를 들어, 이커머스에서 "전자기기, 가전제품, 컴퓨터" 카테고리의 상품을 한 번에 조회하는 경우에 IN 연산자가 완벽한 선택입니다. 기존에는 "status = 'pending' OR status = 'processing' OR status = 'shipped'"처럼 OR을 반복했다면, 이제는 "status IN ('pending', 'processing', 'shipped')"로 간단하게 표현할 수 있습니다.
IN 연산자의 핵심 특징은 괄호 안에 여러 값을 쉼표로 구분하여 나열한다는 점과, 서브쿼리의 결과도 IN에 사용할 수 있다는 점입니다. 이러한 특징들이 복잡한 데이터 필터링을 단순화하고 코드 유지보수를 쉽게 만들어줍니다.
코드 예제
-- IN 연산자 사용 예제
-- 여러 도시에 거주하는 회원 조회
SELECT user_id, name, city
FROM users
WHERE city IN ('Seoul', 'Busan', 'Daegu');
-- 특정 상태의 주문만 조회
SELECT order_id, customer_name, status
FROM orders
WHERE status IN ('pending', 'processing', 'shipped');
-- 특정 카테고리의 상품 조회
SELECT product_name, category, price
FROM products
WHERE category IN ('Electronics', 'Appliances', 'Computers');
-- NOT IN: 목록에 없는 값 조회
SELECT name, department
FROM employees
WHERE department NOT IN ('HR', 'Finance');
설명
이것이 하는 일: IN 연산자는 컬럼 값이 괄호 안의 값 목록 중 어느 하나와 일치하면 TRUE를 반환합니다. 첫 번째로, IN 다음에 괄호를 열고 비교할 값들을 쉼표로 구분하여 나열합니다.
예를 들어 "city IN ('Seoul', 'Busan', 'Daegu')"에서 괄호 안의 세 도시가 비교 대상입니다. 그 다음으로, 데이터베이스는 각 행의 city 컬럼 값을 목록의 모든 값과 하나씩 비교합니다.
'Seoul', 'Busan', 'Daegu' 중 하나라도 일치하면 그 행은 조건을 만족합니다. 내부적으로는 여러 개의 OR 조건과 동일하게 동작하지만 훨씬 간결합니다.
마지막으로, 조건을 만족하는 모든 행을 결과 집합에 포함시킵니다. NOT IN을 사용하면 목록에 없는 값을 가진 행들을 찾을 수 있습니다.
이는 특정 값들을 제외하고 조회할 때 유용합니다. 여러분이 IN 연산자를 사용하면 쿼리가 훨씬 읽기 쉬워지고, 값을 추가하거나 제거할 때 편리하며, 실수로 OR 연산자를 빠뜨리는 오류를 방지할 수 있습니다.
특히 프로그램에서 동적으로 값 목록을 생성할 때 매우 유용합니다.
실전 팁
💡 IN 목록에 너무 많은 값(수천 개 이상)을 넣으면 성능이 떨어질 수 있습니다. 이 경우 임시 테이블이나 JOIN을 고려하세요.
💡 IN 목록에 NULL을 넣어도 NULL 매칭은 되지 않습니다. NULL 비교는 반드시 IS NULL을 사용해야 합니다.
💡 서브쿼리와 함께 사용할 수 있습니다: WHERE user_id IN (SELECT user_id FROM premium_users)
💡 NOT IN 사용 시 목록에 NULL이 하나라도 있으면 결과가 비어 나옵니다. NULL 처리에 주의하세요.
💡 인덱스가 있는 컬럼에 IN을 사용하면 데이터베이스가 효율적으로 최적화할 수 있지만, 목록이 너무 길면 Full Scan이 더 빠를 수 있습니다.
5. LIKE 패턴 매칭 (%와 _)
시작하며
여러분이 "김으로 시작하는 모든 이름"이나 "gmail.com으로 끝나는 이메일"을 찾아야 하는 상황을 겪어본 적 있나요? 정확한 값이 아닌 패턴으로 검색해야 할 때가 많습니다.
이런 문제는 검색 기능을 구현할 때 핵심적입니다. 사용자가 상품명의 일부만 입력해도 결과를 찾아주거나, 특정 형식의 데이터를 찾거나, 부분 문자열로 필터링하는 것은 거의 모든 애플리케이션에서 필요한 기능입니다.
바로 이럴 때 필요한 것이 LIKE 연산자입니다. LIKE를 와일드카드(%, _)와 함께 사용하면 유연한 패턴 매칭이 가능합니다.
개요
간단히 말해서, LIKE 연산자는 문자열이 특정 패턴과 일치하는지 확인하는 패턴 매칭 연산자입니다. 왜 필요한지 실무 관점에서 설명하면, 완전히 일치하는 값만 찾는 것으로는 부족한 경우가 많습니다.
예를 들어, 검색창에서 "노트북"을 입력했을 때 "삼성 노트북", "LG 노트북", "노트북 파우치" 등 관련된 모든 상품을 보여줘야 합니다. 또한 이메일 형식 검증이나 전화번호 패턴 찾기 같은 경우에도 매우 유용합니다.
기존에는 정규표현식을 프로그래밍 언어에서 사용했다면, 이제는 SQL 레벨에서 LIKE로 간단한 패턴 매칭을 처리할 수 있습니다. LIKE의 핵심 특징은 %는 0개 이상의 임의 문자를 대체하고, _는 정확히 1개의 문자를 대체한다는 점입니다.
이러한 특징들이 다양한 검색 시나리오를 간단하게 구현할 수 있게 해줍니다.
코드 예제
-- LIKE 패턴 매칭 사용 예제
-- '김'으로 시작하는 이름 찾기
SELECT name, phone
FROM users
WHERE name LIKE '김%';
-- 'gmail.com'으로 끝나는 이메일 찾기
SELECT user_id, email
FROM users
WHERE email LIKE '%@gmail.com';
-- '노트북'이 포함된 상품명 찾기
SELECT product_name, price
FROM products
WHERE product_name LIKE '%노트북%';
-- 정확히 5글자인 이름 찾기 (언더스코어 5개)
SELECT name
FROM users
WHERE name LIKE '_____';
-- 두 번째 글자가 '영'인 이름 찾기
SELECT name
FROM users
WHERE name LIKE '_영%';
설명
이것이 하는 일: LIKE 연산자는 컬럼의 문자열 값이 지정된 패턴과 일치하는지 검사하여 매칭되면 TRUE를 반환합니다. 첫 번째로, % 와일드카드는 0개 이상의 임의의 문자를 의미합니다.
"name LIKE '김%'"는 '김'으로 시작하는 모든 이름을 찾습니다. '김철수', '김영희', '김' 모두 매칭됩니다.
'%노트북%'처럼 앞뒤에 모두 사용하면 '노트북'이 어디든 포함된 문자열을 찾습니다. 그 다음으로, _ 와일드카드는 정확히 1개의 문자를 대체합니다.
"name LIKE '_영%'"는 두 번째 글자가 '영'인 이름을 찾습니다. '김영희', '박영수'는 매칭되지만 '영희'는 매칭되지 않습니다.
'_____'는 정확히 5글자인 문자열만 매칭합니다. 마지막으로, 데이터베이스는 각 행의 문자열을 패턴과 비교하여 일치하는 행만 결과에 포함시킵니다.
NOT LIKE를 사용하면 패턴과 일치하지 않는 행을 찾을 수 있습니다. 여러분이 LIKE를 사용하면 검색 기능을 쉽게 구현할 수 있고, 부분 문자열 매칭이 가능하며, 간단한 패턴 검증을 SQL 레벨에서 처리할 수 있습니다.
특히 자동완성 기능이나 검색창 구현에 필수적입니다.
실전 팁
💡 LIKE '%검색어%'는 Full Scan을 유발하므로 대용량 테이블에서는 성능이 느립니다. 전문 검색(Full-Text Search)을 고려하세요.
💡 '검색어%'처럼 앞에만 와일드카드가 없으면 인덱스를 활용할 수 있어 성능이 좋습니다.
💡 대소문자 구분은 데이터베이스 설정에 따라 다릅니다. 대소문자 무시하려면 UPPER() 또는 LOWER() 함수를 사용하세요.
💡 실제 %나 _ 문자를 찾으려면 이스케이프 문자를 사용해야 합니다: LIKE '50%' ESCAPE ''
💡 여러 검색어를 OR로 연결하는 대신, 각각 LIKE로 검사하거나 정규표현식 함수(REGEXP)를 고려하세요.
6. NULL 값 처리 (IS NULL, IS NOT NULL)
시작하며
여러분이 "이메일을 입력하지 않은 회원"이나 "배송 주소가 등록되지 않은 주문"을 찾아야 하는 상황을 겪어본 적 있나요? NULL 값은 일반 비교 연산자로는 찾을 수 없어서 당황스러울 때가 많습니다.
이런 문제는 실무에서 데이터 품질 관리에 매우 중요합니다. NULL은 "값이 없음" 또는 "알 수 없음"을 의미하는 특수한 상태인데, 일반 비교 연산자(=, !=)로는 NULL을 제대로 비교할 수 없습니다.
바로 이럴 때 필요한 것이 IS NULL과 IS NOT NULL입니다. 이 연산자들은 NULL 값을 정확하게 처리할 수 있는 유일한 방법입니다.
개요
간단히 말해서, IS NULL은 값이 NULL인지 확인하고, IS NOT NULL은 값이 NULL이 아닌지 확인하는 연산자입니다. 왜 필요한지 실무 관점에서 설명하면, 데이터베이스에서 NULL은 매우 흔합니다.
선택 입력 필드, 아직 입력되지 않은 정보, 적용되지 않는 값 등이 모두 NULL로 저장됩니다. 예를 들어, 필수 정보를 입력하지 않은 사용자를 찾아서 알림을 보내거나, 완전한 데이터만 분석에 사용하고 싶을 때 NULL 체크가 필수입니다.
기존에는 "email = NULL" 같은 잘못된 방식으로 NULL을 체크하여 아무 결과도 나오지 않는 실수를 했다면, 이제는 "email IS NULL"로 정확하게 체크할 수 있습니다. IS NULL의 핵심 특징은 NULL은 "값이 없음"을 나타내는 특수 상태이므로 등호(=)로 비교할 수 없다는 점과, IS NULL/IS NOT NULL이 NULL을 체크하는 유일한 올바른 방법이라는 점입니다.
이러한 특징들이 데이터 무결성과 정확한 데이터 분석을 가능하게 합니다.
코드 예제
-- NULL 값 처리 예제
-- 이메일을 입력하지 않은 회원 찾기
SELECT user_id, name, email
FROM users
WHERE email IS NULL;
-- 전화번호가 입력된 회원만 조회
SELECT user_id, name, phone
FROM users
WHERE phone IS NOT NULL;
-- 배송 주소가 없는 주문 찾기
SELECT order_id, customer_name, shipping_address
FROM orders
WHERE shipping_address IS NULL;
-- 완료 날짜가 없는(진행 중인) 작업 조회
SELECT task_id, task_name, completed_at
FROM tasks
WHERE completed_at IS NULL;
-- 여러 조건 결합: 이메일은 있지만 전화번호는 없는 회원
SELECT user_id, name, email, phone
FROM users
WHERE email IS NOT NULL AND phone IS NULL;
설명
이것이 하는 일: IS NULL은 컬럼 값이 NULL인지 검사하고, IS NOT NULL은 NULL이 아닌 실제 값이 있는지 검사합니다. 첫 번째로, NULL의 개념을 이해해야 합니다.
NULL은 빈 문자열('')이나 0과 다릅니다. NULL은 "값이 존재하지 않음" 또는 "알 수 없음"을 의미하는 특수 상태입니다.
따라서 "email = NULL"은 항상 FALSE를 반환하고, "email != NULL"도 마찬가지입니다. 그 다음으로, IS NULL을 사용하면 컬럼 값이 NULL 상태인지 정확하게 판단할 수 있습니다.
"email IS NULL"은 email 컬럼에 값이 없는 행들을 찾습니다. 데이터베이스는 각 행의 email이 NULL 상태인지 내부적으로 체크합니다.
반대로, IS NOT NULL을 사용하면 실제 값이 존재하는 행만 찾을 수 있습니다. "phone IS NOT NULL"은 전화번호가 입력된 회원만 조회합니다.
이는 필수 정보가 모두 입력된 데이터만 처리하고 싶을 때 유용합니다. 여러분이 이 연산자들을 사용하면 데이터 품질을 체크할 수 있고, 불완전한 데이터를 걸러낼 수 있으며, NULL로 인한 예상치 못한 버그를 방지할 수 있습니다.
특히 집계 함수(SUM, AVG 등)는 NULL을 자동으로 제외하므로 NULL 처리를 정확히 이해하는 것이 중요합니다.
실전 팁
💡 "= NULL"이나 "!= NULL"은 절대 사용하지 마세요. 항상 IS NULL 또는 IS NOT NULL을 사용해야 합니다.
💡 COALESCE(column, default_value) 함수를 사용하면 NULL을 다른 기본값으로 대체할 수 있습니다.
💡 COUNT(*)는 NULL을 포함하지만, COUNT(column)은 NULL을 제외합니다. 이 차이를 이해하고 사용하세요.
💡 NULL과 어떤 값을 비교해도 결과는 NULL입니다. WHERE 절에서 NULL은 FALSE로 취급되어 해당 행이 제외됩니다.
💡 인덱스에 따라 IS NULL 검색 성능이 달라질 수 있습니다. NULL이 많은 컬럼은 부분 인덱스(Partial Index)를 고려하세요.
댓글 (0)
함께 보면 좋은 카드 뉴스
SQL 실전 종합 프로젝트 완벽 가이드
전자상거래 시스템을 직접 구축하면서 배우는 SQL 실전 프로젝트입니다. DB 설계부터 성능 최적화까지, 실무에서 필요한 모든 SQL 기술을 단계별로 마스터할 수 있습니다. 초급 개발자도 따라하기 쉬운 친절한 가이드로 구성되어 있습니다.
실무 데이터 분석 SQL 완벽 가이드
실제 업무에서 자주 사용하는 SQL 데이터 분석 기법을 단계별로 학습합니다. 매출 집계부터 고객 세분화까지, 실전 대시보드 쿼리 작성 방법을 배워보세요.
데이터 모델링과 정규화 완벽 가이드
데이터베이스 설계의 핵심인 데이터 모델링과 정규화를 초급 개발자 눈높이에서 쉽게 설명합니다. ERD 작성부터 제1~3정규형, 정규화의 장단점, 비정규화 전략, 실무 설계 패턴까지 실전에서 바로 활용할 수 있는 노하우를 담았습니다.
트랜잭션과 ACID 원칙 완벽 가이드
데이터베이스의 핵심 개념인 트랜잭션과 ACID 원칙을 초급 개발자도 쉽게 이해할 수 있도록 실무 예제와 함께 설명합니다. 안전한 데이터 처리를 위한 필수 지식을 친근하게 배워보세요.
인덱스와 쿼리 성능 최적화 완벽 가이드
데이터베이스 성능의 핵심인 인덱스를 처음부터 끝까지 배워봅니다. B-Tree 구조부터 실행 계획 분석까지, 실무에서 바로 사용할 수 있는 인덱스 최적화 전략을 초급자도 이해할 수 있게 설명합니다.