컴퓨터공학

SQL 조건문 완전 정복: WHERE, LIKE, IN, BETWEEN, IS NULL, 비교연산자

nyambu 2025. 3. 29. 18:00

SQL 조건문 완전 정복
SQL 조건문 완전 정복

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는 단순 조회를 넘어서 데이터 처리 흐름 전체에 걸쳐 사용되는 핵심 필터링 도구이다.