SQL을 처음 배우다 보면 데이터를 조회할 때 조건을 거는 WHERE 절을 자주 사용하게 됩니다. 숫자나 날짜를 기준으로 조건을 거는 것은 비교적 직관적이지만, 문자열을 조건으로 필터링할 때는 조금 더 유연한 문법이 필요합니다. 이때 유용하게 사용되는 것이 바로 LIKE 연산자와 와일드카드(wildcard)입니다. 이번 글에서는 LIKE가 어떤 역할을 하고, %, _와 같은 와일드카드가 어떻게 사용되는지, 그리고 실무에서는 어떻게 응용할 수 있는지에 대해 차근차근 알아보겠습니다.
LIKE 연산자란 무엇인가?
SQL에서 LIKE 연산자는 문자열에서 특정 패턴을 포함한 데이터를 검색할 때 사용됩니다. 정확히 일치하는 값을 찾는 = 연산자와 달리, LIKE는 유사한 값, 즉 일부분이 일치하는 문자열을 찾아낼 수 있습니다. 기본 문법은 다음과 같습니다:
SELECT column_name
FROM table_name
WHERE column_name LIKE 'pattern';
이때 pattern 부분에 와일드카드 문자를 함께 사용하게 되는데요, 이를 통해 다양한 형태의 문자열을 유연하게 검색할 수 있습니다.
와일드카드 종류 정리
SQL에서 LIKE와 함께 가장 자주 사용되는 두 가지 와일드카드는 아래와 같습니다.
와일드카드 의미 예시 패턴
% 0개 이상의 문자 (전체 문자열) 'A%', '%son'
_ 정확히 1개의 문자 '_im', 'J_hn'
이제 각각의 와일드카드에 대해 예제를 통해 살펴보겠습니다.
% 와일드카드 - 문자열 일부 포함 검색
%는 0개 이상의 문자를 의미합니다. 즉, %는 아무 문자나 얼마든지 들어올 수 있다는 뜻입니다.
▶︎ 1. 시작하는 문자열 찾기
SELECT * FROM users
WHERE name LIKE 'Kim%';
이름이 'Kim'으로 시작하는 모든 사용자 조회
예: Kim, Kimmy, Kimberly 등
▶︎ 2. 특정 단어가 포함된 경우
SELECT * FROM products
WHERE description LIKE '%organic%';
상품 설명에 'organic'이라는 단어가 들어간 경우 모두 조회
예: "100% organic banana", "organic-certified milk"
▶︎ 3. 특정 문자열로 끝나는 경우
SELECT * FROM emails
WHERE address LIKE '%@gmail.com';
gmail 주소를 가진 사용자 조회
예: user1@gmail.com, hello.world@gmail.com
_ 와일드카드 - 정확히 한 글자만 대체
_는 딱 한 글자만을 대체하는 와일드카드입니다. 글자 수는 고정되지만, 특정 자리를 유연하게 지정할 수 있습니다.
▶︎ 1. 정확히 3글자 이름 중 가운데가 'i'인 경우
SELECT * FROM users
WHERE name LIKE 'i';
예: Kim, Tim, Jim
▶︎ 2. 특정 자리만 다를 때
SELECT * FROM codes
WHERE code LIKE 'A_123';
'A'로 시작하고, 두 번째 글자가 아무거나일 수 있으며, 나머지는 '123'인 코드 검색
예: AB123, AC123, AD123
LIKE 사용 시 대소문자 구분?
SQL의 대소문자 구분은 사용하는 데이터베이스 시스템(DBMS)에 따라 다릅니다.
MySQL (기본적으로 구분 안 함)
'apple' LIKE 'APP%' → TRUE
PostgreSQL (기본적으로 구분함)
'apple' LIKE 'APP%' → FALSE
대소문자 구분 없이 검색하려면 LOWER() 함수를 같이 사용하는 방법이 있습니다.
SELECT * FROM users
WHERE LOWER(name) LIKE 'kim%';
이름이 Kim, kim, KIM 등인 사용자 모두 포함
NOT LIKE - 패턴을 포함하지 않는 데이터 조회
LIKE와 반대로, 특정 패턴을 포함하지 않는 데이터를 찾을 수도 있습니다.
SELECT * FROM users
WHERE name NOT LIKE 'A%';
이름이 A로 시작하지 않는 사용자 조회
ESCAPE 문자로 특수문자 검색하기
SQL에서 %, _는 특수한 의미를 갖는 문자입니다. 만약 실제 % 기호나 _ 문자가 포함된 값을 찾고 싶다면 ESCAPE를 사용해야 합니다.
예를 들어, 이메일 내용에서 "100%"라는 문자열을 찾고 싶다면:
SELECT * FROM messages
WHERE content LIKE '%100!%%' ESCAPE '!';
여기서 !는 escape 문자로 사용되고,
!%는 실제 %를 의미합니다.
실무 활용 예시
실제 현업에서 LIKE는 아래와 같은 상황에서 자주 사용됩니다.
로그 메시지 분석
SELECT * FROM logs
WHERE message LIKE '%timeout%';
오류 메시지 중 'timeout'이 포함된 로그만 필터링
고객 이메일 필터링
SELECT * FROM users
WHERE email LIKE '%@naver.com';
네이버 이메일을 사용하는 사용자 목록 조회
상품명 자동완성 기능 구현 시
SELECT name FROM products
WHERE name LIKE '라면%';
사용자가 '라면'이라고 검색했을 때, '라면볶이', '라면사리' 등 출력
LIKE 사용 시 주의사항
1. 퍼포먼스 문제
%로 시작하는 패턴('%value')은 인덱스를 무시하여 속도가 느려질 수 있음
해결책: Full Text Index 또는 Elasticsearch 등의 검색엔진 사용 고려
2. 오타 문제
LIKE는 부분 일치만 찾으므로 정확도는 떨어질 수 있음
예: 'kim'과 'kimmie' 둘 다 포함되므로 주의
3. 정규표현식과 비교
LIKE는 간단한 패턴에 적합
복잡한 문자 패턴을 찾고 싶다면 REGEXP (또는 RLIKE)를 사용할 수 있음
✍️ 마무리
LIKE 연산자와 와일드카드는 SQL에서 문자열 데이터를 유연하게 필터링할 수 있는 핵심 도구입니다. 단순히 = 연산으로는 찾을 수 없는 조건을 LIKE를 통해 쉽게 검색할 수 있으며, 실무에서는 고객 필터링, 로그 검색, 자동완성 구현 등 다양한 곳에 활용됩니다.
특히 %, _의 의미와 쓰임새를 정확히 이해하면 SQL 쿼리의 표현력이 훨씬 더 강력해집니다. 다만 퍼포먼스에 영향을 줄 수 있으므로, 데이터가 많을 경우에는 인덱스 전략이나 대체 도구도 함께 고려하는 것이 좋습니다.
알아두면 검색할 때 편리한 LIKE 문법에 대해 알아봤습니다. 모두가 유용하게 사용하길 바랍니다!