Published on

SQL LIKE 연산자 완전 정복 와일드카드로 검색 패턴 제대로 만들기

Authors

서론

서비스를 운영하다 보면 “이름에 ‘kim’이 들어간 사용자”, “전화번호가 010으로 시작하는 고객”, “상품 코드가 AB로 시작하고 뒤에 숫자 3자리인 상품”처럼 부분 일치 검색 요구가 끊임없이 나옵니다. 이때 가장 먼저 떠오르는 도구가 LIKE 연산자와 와일드카드 %, _입니다.

하지만 LIKE는 간단해 보이는 만큼 실무에서 함정도 많습니다.

  • %keyword%는 편하지만 인덱스를 못 타서 느려질 수 있고
  • _는 “한 글자”라는 특성 때문에 예상과 다른 결과를 만들기도 하며
  • 사용자 입력에 %_가 포함되면 검색 결과가 왜곡될 수 있습니다.

이번 글에서는 LIKE정확하고 안전하게 쓰는 검색 패턴을 만들고, 성능과 트러블슈팅까지 한 번에 정리합니다.

LIKE 기본 문법과 동작 원리

LIKE는 문자열이 특정 패턴과 일치하는지 평가합니다.

SELECT *
FROM users
WHERE name LIKE 'kim%';
  • LIKE 'kim%': kim으로 시작하는 모든 문자열
  • LIKE '%kim': kim으로 끝나는 모든 문자열
  • LIKE '%kim%': 중간에 kim이 포함된 모든 문자열

DBMS마다 문법은 같지만, 대소문자 민감도/정렬(collation), 이스케이프 규칙, 인덱스 사용 가능성이 다를 수 있습니다.

와일드카드 2종 세트 % 와 _

% 의미: 0글자 이상(빈 문자열 포함)

-- 'a'로 시작
WHERE col LIKE 'a%'

-- 'a'로 끝
WHERE col LIKE '%a'

-- 'a' 포함
WHERE col LIKE '%a%'

-- 정확히 'a'도 포함 (0글자 허용)
WHERE col LIKE 'a%'

%는 “없어도 된다”가 핵심입니다. 예를 들어 LIKE 'ab%'ab만 있어도 매칭됩니다.

_ 의미: 정확히 1글자

-- 정확히 3글자이며 a로 시작하고 c로 끝
WHERE col LIKE 'a_c'

-- 010-XXXX-YYYY 형태(하이픈 포함 13글자 가정)
WHERE phone LIKE '010-____-____'

_는 길이 제약을 만들 때 유용합니다. 다만 “문자 1개” 기준이므로, 유니코드/조합문자/이모지 등이 섞인 경우 DBMS의 문자 처리 방식에 따라 체감과 다를 수 있습니다.

자주 쓰는 검색 패턴 레시피

1) 접두사(prefix) 검색: 인덱스를 살릴 수 있는 가장 현실적인 LIKE

-- 이메일이 'dev.'로 시작하는 계정
SELECT id, email
FROM accounts
WHERE email LIKE 'dev.%';

접두사 검색은 많은 DBMS에서 B-Tree 인덱스를 탈 가능성이 있습니다(컬럼/정렬/옵티마이저에 따라 다름). 실무에서 LIKE를 써야 한다면 가장 먼저 고려할 패턴입니다.

2) 접미사(suffix) 검색: 보통 인덱스가 깨진다

-- jpg로 끝나는 파일
SELECT *
FROM files
WHERE filename LIKE '%.jpg';

앞에 %가 오면 대개 인덱스를 못 탑니다. 대량 데이터에서 자주 쓰면 느려지기 쉽습니다.

3) 포함(contains) 검색: 편하지만 가장 비싼 패턴

-- 상품명에 'pro'가 포함
SELECT id, name
FROM products
WHERE name LIKE '%pro%';

%keyword%는 풀스캔이 되기 쉬워 성능 이슈의 단골입니다. 검색 품질과 성능이 중요하면 Full-Text Search(FTS)나 검색엔진(Elasticsearch 등)도 고려하세요.

4) 고정 길이 + 규칙 패턴: 코드/번호 검증에 유용

-- 사번이 EMP- + 숫자 4자리 (EMP-0001 같은 형태)
SELECT *
FROM employees
WHERE emp_no LIKE 'EMP-____';

_를 섞으면 “형태 검증”에 가까운 검색도 가능합니다.

5) 여러 조건 조합: OR보다 UNION/인덱스 설계가 더 나을 때도

-- 이름이 'kim'으로 시작하거나 'lee'로 시작
SELECT *
FROM users
WHERE name LIKE 'kim%'
   OR name LIKE 'lee%';

OR 조건이 많아지면 실행계획이 복잡해지고 느려질 수 있습니다. 자주 쓰는 패턴이면 별도 검색 컬럼(정규화된 키)이나 인덱스 전략을 고민하세요.

사용자 입력을 그대로 LIKE에 넣을 때 생기는 보안/정확도 문제

1) SQL 인젝션: LIKE도 예외가 아니다

사용자 입력을 문자열로 이어붙이면 위험합니다.

-- 나쁜 예 (문자열 결합)
SELECT * FROM users WHERE name LIKE '%