데이터베이스에서 LIKE와 ILIKE의 차이 완벽 정리
- IT/데이터베이스(DataBase)
- 2025. 6. 1.
데이터베이스에서 문자열 검색은 매우 흔한 작업입니다. 특히 SQL 쿼리를 작성할 때 LIKE와 ILIKE 연산자는 문자열 패턴 매칭에 자주 사용됩니다. 하지만 이 둘의 차이점이 무엇인지, 언제 어떤 것을 사용해야 하는지 헷갈릴 때가 많죠. 이번 포스팅에서는 LIKE와 ILIKE의 차이를 초보자도 이해할 수 있도록 명확히 설명하고, 실무에서 유용한 예제를 통해 활용 방법을 알려드리겠습니다.
LIKE와 ILIKE란?
LIKE와 ILIKE는 SQL에서 문자열을 패턴에 따라 검색할 때 사용하는 연산자입니다. 주로 WHERE 절에서 사용되며, 특정 문자열이 패턴과 일치하는지 확인합니다. 하지만 이 둘은 대소문자 처리 방식에서 차이가 있습니다.
- LIKE: 대소문자를 구분하는 패턴 매칭 연산자입니다. 즉, 검색 시 대소문자가 정확히 일치해야 매칭됩니다.
- ILIKE: 대소문자를 구분하지 않는 패턴 매칭 연산자입니다. Insensitive LIKE의 약자로, 대소문자에 상관없이 패턴을 검색합니다.
LIKE와 ILIKE의 차이점
가장 큰 차이점은 대소문자 민감도입니다. 아래 표를 통해 간단히 비교해보겠습니다.
연산자 | 대소문자 구분 | 지원 데이터베이스 | 사용 예시 |
LIKE | 구분함 | 대부분의 SQL (MySQL, PostgreSQL, SQL Server 등) | WHERE name LIKE 'John%' |
ILIKE | 구분하지 않음 | PostgreSQL 전용 | WHERE name ILIKE 'john%' |
1. LIKE의 동작 방식
LIKE는 대소문자를 엄격히 구분합니다. 예를 들어, 'John'과 'john'은 서로 다른 문자열로 간주됩니다. 아스키 코드가 다르기 때문입니다.
SELECT * FROM users WHERE name LIKE 'John%';
위 쿼리는 John, Johnny 등으로 시작하는 이름만 반환합니다. 하지만 john이나 JOHNNY는 결과에 포함되지 않습니다.
2. ILIKE의 동작 방식
ILIKE는 대소문자를 무시하고 패턴을 매칭합니다. PostgreSQL에서만 지원되는 연산자로, 대소문자에 민감하지 않은 검색이 필요할 때 유용합니다.
SELECT * FROM users WHERE name ILIKE 'john%';
이 쿼리는 John, john, JOHNNY, Johnny 등 대소문자에 상관없이 john으로 시작하는 모든 이름을 반환합니다.
LIKE와 ILIKE 사용 예제
실제 데이터베이스 환경에서의 사용법을 예제를 통해 알아보겠습니다. 아래는 users 테이블에 저장된 데이터입니다.
id | name |
1 | John Doe |
2 | john Smith |
3 | JOHNNY Lee |
4 | Jane Doe |
예제 1: LIKE로 검색
SELECT * FROM users WHERE name LIKE 'John%';
결과:
id | name |
1 | John Doe |
John으로 시작하는 이름만 반환됩니다.
예제 2: ILIKE로 검색
SELECT * FROM users WHERE name ILIKE 'john%';
결과:
id | name |
1 | John Doe |
2 | john Smith |
3 | JOHNNY Lee |
대소문자에 상관없이 john으로 시작하는 모든 이름이 반환됩니다.
LIKE와 ILIKE의 패턴 매칭 기호
LIKE와 ILIKE는 동일한 패턴 매칭 기호를 사용합니다:
- %: 0개 이상의 문자와 일치합니다.
- _: 정확히 한 문자와 일치합니다.
예제: 패턴 매칭 활용
-- 이름이 'J'로 시작하고 4글자인 경우
SELECT * FROM users WHERE name LIKE 'J___';
-- 이름에 'doe'를 포함하는 경우 (대소문자 무시)
SELECT * FROM users WHERE name ILIKE '%doe%';
LIKE와 ILIKE의 지원 범위
- LIKE: 대부분의 SQL 데이터베이스(MySQL, PostgreSQL, SQL Server, Oracle 등)에서 지원됩니다.
- ILIKE: PostgreSQL에서만 지원됩니다. MySQL이나 SQL Server에서는 대소문자를 구분하지 않는 검색을 위해 다른 방법을 사용해야 합니다.
MySQL에서 대소문자 무시 검색
MySQL에서는 LIKE 자체가 기본적으로 대소문자를 구분하지 않습니다. 하지만 명확히 대소문자를 구분하고 싶다면 BINARY 키워드를 사용하세요.
-- MySQL에서 대소문자 구분 검색
SELECT * FROM users WHERE name LIKE BINARY 'John%';
SQL Server에서 대소문자 무시 검색
SQL Server에서는 데이터베이스 콜레이션 설정에 따라 대소문자 민감도가 결정됩니다. 대소문자를 무시하려면 LOWER() 또는 UPPER() 함수를 사용할 수 있습니다.
SELECT * FROM users WHERE LOWER(name) LIKE 'john%';
성능 고려사항
LIKE와 ILIKE는 성능에 약간의 차이가 있을 수 있습니다:
- LIKE: 대소문자를 구분하므로 비교가 더 빠를 수 있습니다.
- ILIKE: 대소문자를 무시하기 위해 추가 연산이 필요하므로 약간 느릴 수 있습니다. 특히 대규모 데이터베이스에서는 인덱스를 활용하지 않으면 성능 저하가 발생할 수 있습니다.
성능 최적화 팁
- 인덱스 사용: LIKE 패턴이 %로 시작하지 않을 경우 인덱스를 활용할 수 있습니다.
- 트라이그램 인덱스: PostgreSQL에서 ILIKE 성능을 높이기 위해 pg_trgm 확장을 사용해 트라이그램 인덱스를 설정하세요.
CREATE EXTENSION pg_trgm;
CREATE INDEX idx_name_trgm ON users USING GIN (name gin_trgm_ops);
자주 묻는 질문 (FAQ)
1. MySQL에서 ILIKE를 사용할 수 있나요?
아니요, ILIKE는 PostgreSQL 전용입니다. MySQL에서는 LIKE가 기본적으로 대소문자를 구분하지 않으므로 별도 처리 없이 비슷한 결과를 얻을 수 있습니다.
2. ILIKE 성능이 느릴 때는 어떻게 하나요?
인덱스를 활용하거나, pg_trgm 확장을 사용해 트라이그램 인덱스를 설정하세요. 또한 불필요한 % 사용을 줄이는 것도 도움이 됩니다.
3. LIKE와 ILIKE 외에 다른 대안은?
PostgreSQL에서는 정규 표현식(~ 또는 ~*)을 사용할 수 있습니다. 예: WHERE name ~* 'john'는 대소문자를 무시합니다.
다음 시간에는 어떤 글을 알아보겠습니다! 최근 핫한 주제인 **'데이터베이스에서 JSON 데이터 다루는 최신 기법'**을 다뤄볼 예정입니다. JSONB와 NoSQL의 장점을 비교하며 실무 활용 팁까지 정리해드릴게요!