VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
=는 값 전체를 일치시킵니다. LIKE는 패턴을 일치시키므로, 어떤 단어로 시작하거나 끝나는 제목, 또는 주어진 모양을 가진 제목을 요청할 수 있습니다.
시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.
LIKE의 동작 방식
PATTERN_TEXT를 일치시킬 패턴으로 바꾸세요. 패턴은 보통의 텍스트에 2개의 특수 문자를 더한 것입니다:
패턴의 나머지는 모두 자기 자신과 일치합니다.
%도 _도 없는 패턴은 =와 거의 같게 동작합니다. 둘은 끝의 공백에서 갈립니다: utf8mb4_general_ci 같은 PAD SPACE 콜레이션에서는 'a ' = 'a'가 참이고 'a ' LIKE 'a'는 거짓입니다. 모든 utf8mb4_0900 콜레이션이 그렇듯 NO PAD 콜레이션에서는 둘 다 거짓입니다.
예제
- ~로 시작
- ~로 끝남
- 고정된 문자 수
J 뒤의 밑줄 3개는 정확히 4글자인 이름을 요청합니다.
JOHNNY는 목록에 없는데, J___는 4글자와 일치하고 그 이상은 아니기 때문입니다.
- 일치하지 않음
여기서 LIKE는 대소문자를 무시합니다
같은 패턴을 소문자로 써도 같은 행이 돌아옵니다.LIKE에 관한 규칙이 아닙니다. 열에 관한 규칙으로, 열의 콜레이션이 2개의 문자열을 같은 것으로 칠지 결정합니다. Sakila의 콜레이션은 대소문자를 구분하지 않고, MySQL 기본값도 그렇습니다. 대소문자 구분 수업이 열을 확인하는 방법과 대소문자를 구분하는 일치를 요청하는 방법을 보여줍니다.
문자 그대로의 % 또는 _ 일치시키기
검색 텍스트의%는 달리 말하지 않는 한 와일드카드입니다. ESCAPE는 바로 뒤의 문자를 끄는 문자를 지정하므로, 패턴이 진짜 퍼센트 기호를 요청할 수 있습니다.
a%b는 %가 xx를 대신했으므로 axxb와 일치했습니다. a!%b는 a와 b 사이의 문자 그대로의 퍼센트 기호를 요청했는데, axxb에는 그것이 없습니다.
ESCAPE가 없으면 역슬래시가 다음 문자를 이스케이프하므로, 'a\%b'도 같은 뜻입니다. 그 지름길은 서버의 sql_mode에 NO_BACKSLASH_ESCAPES가 있으면 동작을 멈추고, ESCAPE는 어느 쪽이든 동작합니다.
앞에 오는 %가 비싼 쪽입니다
LIKE 'ACADEMY%'는 열의 인덱스를 사용할 수 있는데, 모든 일치가 같은 알려진 텍스트로 시작하고 인덱스는 정렬된 순서로 보관되므로, 서버가 그 부분으로 바로 건너뛰기 때문입니다. LIKE '%GOLDFINGER'는 일치가 어디서든 시작할 수 있어 출발점을 주지 못하므로, 서버는 열의 모든 값을 읽고 하나씩 검사합니다. 2개의 쿼리에 EXPLAIN을 실행하면 차이가 보입니다: 추정 행 1개 대 1,000개.
1,000개의 영화에서는 아무도 알아채지 못합니다. 큰 테이블에서는 조회와 전체 스캔의 차이입니다. 대규모로 텍스트 안을 검색해야 할 때는 다른 도구가 맞습니다: MySQL의 전문 검색을 보세요.
요약
- 값 전체가 아니라 패턴을 일치시키려면
LIKE를 사용하세요. %는 아무 문자의 연속으로,_는 정확히 1개의 문자로 읽으세요.- 문자 그대로의
%나_를 일치시키려면ESCAPE로 이스케이프 문자를 지정하세요. - 대소문자가 중요한지는
LIKE가 아니라 열의 콜레이션이 결정합니다. - 큰 테이블에서는 앞에 오는
%를 피하세요. 어떤 인덱스도 검색 범위를 좁힐 수 없습니다.
함께 보기
- REGEXP —
%와_로 나타낼 수 없는 패턴 - 대소문자 구분 — 소문자 패턴이 일치한 이유
- MySQL 문자열 함수 — 비교하기 전에 텍스트 다듬기
- MySQL의 전문 검색 — 대규모로 텍스트 안 검색하기