MySQL 와일드카드: Like, NOT Like, Escape, ( % ), ( _ )
⚡ 스마트 요약
MySQL 와일드카드는 LIKE 및 NOT LIKE 연산자와 특수 문자를 조합하여 패턴 기반 검색을 가능하게 합니다. 이는 백분율 및 밑줄 와일드카드, ESCAPE 키워드, myflixdb 데이터베이스에 대한 실제 쿼리, 그리고 성능 고려 사항에 대한 설명을 제공합니다.

무엇인가 MySQL 와일드카드?
MySQL 와일드 카드 와일드카드는 정확한 값이 아닌 복잡한 패턴과 일치하는 데이터를 검색하는 데 도움이 되는 특수 문자입니다. 와일드카드는 항상 LIKE 비교 연산자 또는 NOT LIKE 비교 연산자와 함께 사용됩니다.
MySQL 두 개의 와일드카드 문자를 지원하며, 각 문자는 데이터에 대한 서로 다른 질문에 답합니다.
| 와일드 카드 | 의미 | 예시 패턴 | 매치 |
|---|---|---|---|
| % | 0개 이상의 문자 | '%암호%' | Code 이름 블랙, 다빈치 Code |
| _ | 정확히 한 글자 | '200_' | 2005, 2008 |
이제 두 캐릭터에 대해 알아보았으니, 다음 섹션에서는 왜 이들을 배워야 하는지 설명합니다.
와일드카드를 사용하는 이유는 무엇일까요? MySQL?
SQL에 익숙하다면 SELECT와 WHERE 절을 사용하여 복잡한 데이터도 검색할 수 있다고 생각할 수 있습니다. 그렇다면 와일드카드를 사용할 이유가 무엇일까요?
이 질문에 답하기 전에 예시를 살펴보겠습니다. Myflix 비디오 라이브러리의 마케팅 부서에서 텍사스 주에서 프로모션을 진행했고, 텍사스 주에서 가입한 회원 수에 대한 피드백을 받고 싶다고 가정해 보겠습니다. 다음 SELECT 문과 WHERE 절을 사용하면 원하는 정보를 얻을 수 있습니다.
SELECT * FROM members WHERE postal_address = 'Austin, TX' OR postal_address = 'Dallas, TX' OR postal_address = 'Iola, TX' OR postal_address = 'Houston, TX';
위의 쿼리에서 볼 수 있듯이 "WHERE 절"는 길고 불안정해집니다. 새로운 도시를 하나씩 수동으로 추가해야 하고, 주소 하나라도 잘못 입력되면 자동으로 제외됩니다. 와일드카드를 사용하면 하나의 패턴으로 해당 주의 모든 도시를 검색할 수 있으므로 쿼리가 간소화됩니다.
SELECT * FROM members WHERE postal_address LIKE '%TX';
요약하자면, 와일드카드를 사용하면 훨씬 적은 SQL 코드로 데이터 기반 애플리케이션에 강력한 검색 기능을 구축할 수 있습니다. 다음 섹션에서는 각 와일드카드 문자에 대해 자세히 설명합니다.
유형 MySQL 와일드 카드
% – 백분율 와일드카드
퍼센트(%) 문자는 특정 패턴을 지정하는 데 사용됩니다. 0개 이상의 문자. 기본 구문은 다음과 같습니다.
SELECT * FROM table_name WHERE fieldname LIKE 'xxx%';
여기 :
- "SELECT 문”는 표준 SQL SELECT 명령입니다.
- "WHERE"는 필터를 적용하는 데 사용되는 키워드입니다.
- "LIKE"는 와일드카드와 함께 사용되는 비교 연산자입니다.
- 'xxx'는 단일 문자 또는 그 이상의 문자와 같은 지정된 패턴이며, "%"는 0부터 시작하는 임의의 문자 수와 일치합니다.
위 설명을 완전히 이해하기 위해 실제 사례를 살펴보겠습니다. 제목에 "code"라는 단어가 포함된 모든 영화를 찾고 싶다고 가정해 보겠습니다. 이 경우 "code"라는 단어의 양쪽에 퍼센트 와일드카드를 사용하여 제목의 어느 위치에서든 패턴 일치를 수행할 수 있습니다.
SELECT * FROM movies WHERE title LIKE '%code%';
위 스크립트를 실행하면 MySQL 워크 벤치 myflixdb 데이터베이스를 대상으로 검색한 결과는 아래와 같습니다.
| 영화_ID | 제목 | 이사 | 연도_출시 | 카테고리_ID |
|---|---|---|---|---|
| 4 | Code 이름 블랙 | 에드가 짐즈 | 2010 | NULL |
| 7 | 다 빈치 Code | NULL | NULL | 6 |
제목의 시작이나 끝에 "code"라는 단어가 있더라도 검색 결과에 나타나는 것을 확인할 수 있습니다. 이는 검색 패턴이 "code" 앞뒤로 임의의 문자 수를 허용하기 때문입니다.
이제 백분율 와일드카드가 검색 조건의 맨 처음에만 나타나도록 스크립트를 수정해 보겠습니다.
SELECT * FROM movies WHERE title LIKE '%code';
위 스크립트를 실행하면 MySQL Workbench를 사용하여 myflixdb 데이터베이스를 분석한 결과는 아래와 같습니다.
| 영화_ID | 제목 | 이사 | 연도_출시 | 카테고리_ID |
|---|---|---|---|---|
| 7 | 다 빈치 Code | NULL | NULL | 6 |
단 하나의 레코드만 반환되었음을 확인하십시오. 이 패턴은 제목의 시작 부분에 있는 문자 수에 관계없이 일치하지만 제목은 다음 조건을 충족해야 합니다. end "코드"와 함께.
이제 백분율 와일드카드를 패턴의 끝으로 옮겨 보겠습니다. 수정된 스크립트는 아래와 같습니다.
SELECT * FROM movies WHERE title LIKE 'code%';
위 스크립트를 실행하면 MySQL Workbench를 사용하여 myflixdb 데이터베이스를 분석한 결과는 아래와 같습니다.
| 영화_ID | 제목 | 이사 | 연도_출시 | 카테고리_ID |
|---|---|---|---|---|
| 4 | Code 이름 블랙 | 에드가 짐즈 | 2010 | NULL |
이 패턴은 모든 제목과 일치하므로 하나의 레코드만 다시 반환됩니다. 시작 "code" 뒤에 임의의 문자가 오는 형태입니다. 따라서 % 기호의 위치에 따라 검색 의미가 결정됩니다.
💡 팁: 'code%'와 같은 패턴은 제목 열에 인덱스를 사용할 수 있지만, '%code%'는 사용할 수 없습니다. 앞에 백분율 와일드카드가 붙으면 인덱스 사용이 강제됩니다. MySQL 모든 행을 스캔해야 하므로 검색에서 허용하는 한 와일드카드를 오른쪽에 유지하세요.
_ – 밑줄 와일드카드
밑줄 와일드카드는 다음과 같은 용도로 사용됩니다. 정확히 한 문자와 일치200x년에 개봉한 모든 영화를 찾고 싶다고 가정해 봅시다. 여기서 x는 임의의 값을 가질 수 있는 단일 문자입니다. 아래 스크립트는 "200x"년에 개봉한 모든 영화를 선택합니다.
SELECT * FROM movies WHERE year_released LIKE '200_';
위 스크립트를 실행하면 MySQL Workbench를 사용하여 myflixdb 데이터베이스를 분석한 결과는 아래와 같습니다.
| 영화_ID | 제목 | 이사 | 연도_출시 | 카테고리_ID |
|---|---|---|---|---|
| 2 | 사라 마샬을 잊어버림 | 니콜라스 스톨 러 | 2008 | 2 |
| 9 | Honey moon | 존 슐츠 | 2005 | 8 |
year_released 값이 200 뒤에 임의의 문자 하나가 오는 영화만 반환된다는 점에 유의하세요. 백분율 와일드카드와 달리 밑줄(_)은 한 문자만 입력할 수 있는 자리를 예약합니다.
와일드카드와는 다릅니다
NOT 논리 연산자는 와일드카드와 함께 사용하여 조건을 만족하지 않는 행을 반환할 수 있습니다. 지원 지정된 패턴과 일치합니다.
200x년에 개봉되지 않은 영화를 찾고 싶다고 가정해 보겠습니다. 아래와 같이 논리 연산자 NOT과 와일드카드(밑줄)를 조합합니다.
SELECT * FROM movies WHERE year_released NOT LIKE '200_';
| 영화_ID | 제목 | 이사 | 연도_출시 | 카테고리_ID |
|---|---|---|---|---|
| 1 | 캐리비안의 해적 4 | 롭 마샬 | 2011 | 1 |
| 4 | Code 이름 블랙 | 에드가 짐즈 | 2010 | NULL |
| 8 | 하계-Awakeninh | 마이클 엘 | 2012 | 6 |
NOT 연산자는 와일드카드 비교 결과를 반전시키기 때문에 200x 패턴을 따르지 않는 영화만 반환됩니다. 참고로, 행에는 다음과 같은 내용이 포함됩니다. NULL LIKE 또는 NOT LIKE 연산자는 NULL 값을 반환하지 않습니다. NULL은 같지 않음을 의미하는 것이 아니라 알 수 없음을 의미하기 때문입니다.
탈출 키워드
ESCAPE 키워드는 다음과 같이 사용됩니다. 이스케이프 패턴 일치 문자 예를 들어 백분율(%)이나 밑줄(_)은 데이터 자체의 일부를 구성하는 경우입니다.
예를 들어 "67%"라는 문자열을 검색한다고 가정해 보겠습니다. 이 경우 이스케이프 문자를 선언하고, 데이터로 읽어야 하는 문자 바로 앞에 배치합니다.
LIKE '67#%%' ESCAPE '#';
만약 우리가 영화 "67% Guilty"를 찾고 싶다면, 아래에 제시된 스크립트를 사용할 수 있습니다.
SELECT * FROM movies WHERE title LIKE '67#%%' ESCAPE '#';
LIKE 절에 있는 이중 "%%"에 유의하세요. 첫 번째 %% 앞에는 이스케이프 문자(#)가 붙어 있으므로 검색 대상 문자열의 일부로 간주됩니다. 두 번째 %%는 와일드카드 의미를 유지하며 뒤에 오는 문자의 개수에 관계없이 일치합니다.
어떤 문자든 이스케이프 문자로 사용할 수 있으므로 등호(=)를 사용해도 동일한 쿼리가 작동합니다.
SELECT * FROM movies WHERE title LIKE '67=%%' ESCAPE '=';
와일드카드는 간단한 패턴을 매우 잘 표현하지만, 일부 검색에는 더 표현력이 풍부한 규칙이 필요합니다. 아래 비교는 한계를 보여줍니다.
MySQL 와일드카드와 정규 표현식 중 어떤 것을 사용해야 할까요?
MySQL 두 개의 와일드카드 문자만 지원합니다. 다른 데이터베이스 엔진에서 LIKE 절 내부에 허용하는 [ac]와 같은 문자 목록은 지원되지 않습니다. 검색에 문자 범위, 대체 또는 앵커링이 필요한 경우, 정규 표현식 연산자 올바른 선택입니다.
| 표준 | 와일드카드를 사용하면 좋아요 | REGEXP |
|---|---|---|
| 패턴 파워 | 기호는 %와 _ 두 개만 사용하세요. | 문자 클래스, 범위, 교대, 반복 |
| 일반적인 사용 | 접두사, 접미사 또는 "포함" 검색 | 유효성 검사, 복잡한 매칭, 다중 대안 |
| 인덱스 사용량 | 패턴이 %로 시작하지 않는 경우 가능합니다. | 인덱스를 전혀 사용하지 않습니다. |
| 가독성 | 초보자를위한 간단 | 더 가파른 학습 곡선 |
일반적으로는 LIKE 연산자를 먼저 사용하세요. 가독성이 좋고, 두 연산자 중 유일하게 인덱스를 활용할 수 있기 때문입니다. 하나의 패턴으로 여러 가지 표현이 가능한 경우, 예를 들어 숫자로 시작하는 모든 제목을 일치시켜야 하는 경우에는 REGEXP 연산자를 사용하세요. 두 연산자 모두 읽기 전용 비교 연산자이므로, 어느 것도 반환되는 행을 변경하지 않습니다. INSERT or UPDATE 문장들은 WHERE 절이 선택하는 내용만 필터링합니다.
