1. WHERE 절의 개념과 필요성
WHERE 절은 SQL 문장에서 특정 조건을 걸어 원하는 데이터만 선택적으로 조회하거나 수정, 삭제할 수 있도록 도와주는 절이다. SELECT뿐 아니라 INSERT, UPDATE, DELETE에도 모두 사용된다.
예를 들어, 고객 테이블에서 ‘서울’에 거주하는 고객만 조회하고 싶다면 다음과 같이 사용할 수 있다:
SELECT * FROM customers WHERE city = 'Seoul';
WHERE 절이 없다면 모든 데이터를 대상으로 명령이 실행되므로, 특히 UPDATE나 DELETE에서는 WHERE 누락이 치명적인 사고로 이어질 수 있다.
2. 비교 연산자: 기본 조건 설정하기
SQL에서 WHERE 절과 함께 자주 사용되는 기본 비교 연산자는 다음과 같다:
연산자 | 의미 | 예시 |
= | 같음 | age = 30 |
!=, <> | 같지 않음 | name != '홍길동' |
> | 보다 큼 | salary > 50000 |
< | 보다 작음 | stock < 10 |
>= | 크거나 같음 | score >= 90 |
<= | 작거나 같음 | score <= 60 |
2-1. 예시 1: 30세 이상 고객 조회
SELECT name, age FROM customers WHERE age >= 30;
2-2. 예시 2: 특정 상품 제외 조회
SELECT * FROM products WHERE product_name != 'iPhone';
비교 연산자는 숫자, 날짜, 문자열 모두에 적용 가능하지만, 데이터 타입에 주의해야 한다. 예를 들어 문자열은 '로 감싸야 하고, 날짜는 'YYYY-MM-DD' 형식이어야 한다.
3. LIKE: 패턴 매칭을 통한 검색
LIKE는 문자열에서 특정 패턴에 일치하는 값을 찾을 때 사용된다. 주로 검색 기능에서 많이 활용된다.
패턴 | 의미 |
% | 0개 이상의 임의의 문자 |
_ | 임의의 한 글자 |
3-1. 예시 1: '홍'으로 시작하는 이름 조회
SELECT * FROM customers WHERE name LIKE '홍%';
→ ‘홍길동’, ‘홍상수’ 등 포함
3-2. 예시 2: ‘수’로 끝나는 이름 조회
SELECT * FROM customers WHERE name LIKE '%수';
3-3. 예시 3: 두 번째 글자가 ‘길’인 이름
SELECT * FROM customers WHERE name LIKE '_길%';
LIKE는 단순하지만 강력한 기능으로, 검색창 자동완성, 키워드 검색, 이름 필터링 등에 자주 사용된다. 다만 인덱스를 잘못 활용할 수 있으므로 선두에 와일드카드(%)가 오는 경우는 성능상 주의가 필요하다.
4. IN: 여러 조건 중 하나라도 해당될 때
IN은 다수의 값 중 하나에 포함될 경우 조건을 만족하는 구조이다. OR 조건을 깔끔하게 대체할 수 있어 가독성과 효율성이 좋다.
4-1. 예시 1: 특정 도시 거주 고객 조회
SELECT * FROM customers WHERE city IN ('Seoul', 'Busan', 'Incheon');
4-2. 예시 2: 특정 카테고리 상품만 조회
SELECT * FROM products WHERE category_id IN (1, 3, 5, 7);
4-3. NOT IN 사용 예시
SELECT * FROM employees WHERE department_id NOT IN (2, 4);
SELECT name FROM products WHERE category_id IN (SELECT id FROM categories WHERE type = '전자제품');
IN은 정적인 값뿐 아니라 서브쿼리와 함께 사용하는 경우도 많다. 이처럼 IN은 조건 리스트를 관리하기 쉽게 만들어주는 강력한 도구이다.
5. BETWEEN: 범위 조건 지정하기
BETWEEN A AND B는 A 이상 B 이하의 범위를 의미한다. 숫자, 날짜, 알파벳 모두에 사용 가능하다.
5-1. 예시 1: 가격이 1만 원에서 3만 원 사이인 상품 조회
SELECT * FROM products WHERE price BETWEEN 10000 AND 30000;
5-2. 예시 2: 특정 기간 동안의 주문 조회
SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
5-3. 주의사항
- BETWEEN은 경계값도 포함한다. 즉 price >= 10000 AND price <= 30000과 동일하다.
- 날짜 형식은 'YYYY-MM-DD' 또는 'YYYY-MM-DD HH:MM:SS'로 정확히 입력해야 한다.
6. IS NULL / IS NOT NULL: 비어 있는 값 다루기
SQL에서 NULL은 ‘값이 없음’을 의미한다. 이는 공백이나 0과는 다르며, 어떤 값도 존재하지 않는 상태이다.
6-1. NULL 값 조회
SELECT * FROM users WHERE phone IS NULL;
→ 전화번호가 등록되지 않은 사용자만 조회
6-2. NULL이 아닌 값 조회
SELECT * FROM users WHERE address IS NOT NULL;
→ 주소 정보가 입력된 사용자만 조회
6-3. 잘못된 예: 비교 연산자 사용
-- 잘못된 방식
SELECT * FROM users WHERE phone = NULL;
-- 올바른 방식
SELECT * FROM users WHERE phone IS NULL;
NULL은 어떤 값과도 같지 않으며, 오직 IS NULL, IS NOT NULL로만 검사할 수 있다. 실무에서는 회원 정보 누락 체크, 결측 데이터 필터링에 자주 사용된다.
7. 복합 조건문: AND, OR, NOT의 활용
조건문은 한 가지만 사용하는 경우보다 복수 조건을 조합하여 더 정밀한 필터링을 자주 사용한다.
연산자 | 의미 |
AND | 모두 만족할 때 |
OR | 하나라도 만족하면 됨 |
NOT | 조건 부정 |
7-1. 예시 1: 서울 고객 중 나이가 30 이상인 경우
SELECT * FROM customers WHERE city = 'Seoul' AND age >= 30;
7-2. 예시 2: 관리자 또는 운영자 권한이 있는 사용자
SELECT * FROM users WHERE role = 'admin' OR role = 'manager';
7-3. 예시 3: 특정 이메일 주소가 아닌 사용자
SELECT * FROM users WHERE email NOT LIKE '%@test.com';
괄호를 사용하면 연산 우선순위를 제어할 수 있다
SELECT * FROM orders WHERE (status = '완료' OR status = '배송중') AND order_date >= '2024-01-01';
복합 조건은 실무 쿼리의 핵심이며, 검색 조건, 필터, 보안 조건 등에 반드시 사용된다.
8. WHERE 절은 SELECT 외에도 쓰인다
많은 초보자들이 착각하는 것 중 하나는 WHERE이 SELECT에만 쓰인다고 생각하는 것이다. 하지만 WHERE은 UPDATE, DELETE, 심지어 INSERT 서브쿼리에서도 매우 중요하게 사용된다.
8-1. UPDATE에 사용
UPDATE users SET status = '휴면' WHERE last_login < '2023-01-01';
→ 1년 이상 로그인하지 않은 사용자들을 휴면 처리한다.
8-2. DELETE에 사용
DELETE FROM logs WHERE created_at < '2023-12-31';
→ 오래된 로그 데이터를 삭제
8-3. INSERT + SELECT에 사용
INSERT INTO archive_orders
SELECT * FROM orders WHERE order_date < '2023-01-01';
→ 조건에 맞는 주문 데이터를 별도 보관용 테이블에 옮김
이처럼 WHERE는 단순 조회를 넘어서 데이터 처리 흐름 전체에 걸쳐 사용되는 핵심 필터링 도구이다.
'컴퓨터공학' 카테고리의 다른 글
SQL JOIN 완전 정복: 테이블을 연결하는 진짜 기술 (0) | 2025.04.03 |
---|---|
SQL 집계 함수와 GROUP BY 완전 정복: 데이터 요약의 기술 (0) | 2025.04.03 |
SQL 문법 기초 정복: SELECT부터 DELETE까지 완전 정리 (0) | 2025.03.29 |
고급 정규형 정리: BCNF, 4NF, 5NF를 완전히 이해하자 (0) | 2025.03.28 |
정규화란 무엇인가? 데이터 구조를 정제하는 방법 (0) | 2025.03.28 |