[MySQL] 특정 문자를 포함하는 데이터 검색하기
LIKE, REGEXP 연산자를 이용해 특정 문자열을 포함하는 데이터 검색하기
✔️ LIKE 연산자
- 기본 구조 :
SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '패턴' - WHERE 절 안에서 특정 문자열을 포함하는 데이터를 찾을 때 사용
- 찾고자하는 문자열의 일부로(패턴) 데이터를 검색할 수 있음
1. 와일드카드
LIKE 연산자와 함께 사용되는 %, _는 와일드카드라고 불린다.
%: 글자 수 제한없이, 패턴을 포함하는 데이터를 불러올 때 사용_: 글자 수를 제한하여 데이터를 불러올 때 사용
2. 예시로 이해하기
데이터(SAVING_DATA)는 임의로 만든 것이며 고객ID에서 A(성인), K(어린이), M(남성), W(여성)을 의미하며 고객전화번호에 어린이는 kid_number 라는 문자열을 포함한다.
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납입금액 |
|---|---|---|---|---|---|---|---|
| AW_0001 | Ella | 1992-11-12 | 010-1234-** | A | 6% | 3회 | 2,000,000 |
| AM_0002 | Micle | 1954-01-03 | 010-2345-** | A | 6% | 11회 | 1,450,000 |
| AM_0003 | Nini | 1922-02-02 | 010-3456-** | C | 11% | 20회 | 13,500,000 |
| AW_0004 | Jacob | 1985-09-22 | 010-4567-** | B | 5% | 10회 | 5,000,000 |
| KM_0001 | Max | 2008-10-20 | kid_number | D | 8% | 1회 | 100,000 |
| KW_0002 | Haily | 2010-04-10 | kid_number | D | 8% | 6회 | 750,000 |
(1) 고객이 어린이인 데이터 찾기
고객ID가 K(어린이)로 시작되는 모든 데이터를 출력하기 위해 % 를 사용하였다.
SELECT *
FROM SAVING_DATA
WHERE 고객ID LIKE 'K%'
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납입금액 |
|---|---|---|---|---|---|---|---|
| KM_0001 | Max | 2008-10-20 | kid_number | D | 8% | 1회 | 100,000 |
| KW_0002 | Haily | 2010-04-10 | kid_number | D | 8% | 6회 | 750,000 |
(2) 고객이 여성인 데이터 찾기
고객ID가 W(여성)를 포함하는 모든 데이터를 출력하기 위해 패턴 양쪽으로 % 를 추가했다.
SELECT *
FROM SAVING_DATA
WHERE 고객ID LIKE '%W%'
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납입금액 |
|---|---|---|---|---|---|---|---|
| AW_0001 | Ella | 1992-11-12 | 010-1234-** | A | 6% | 3회 | 2,000,000 |
| AW_0004 | Jacob | 1985-09-22 | 010-4567-** | B | 5% | 10회 | 5,000,000 |
| KW_0002 | Haily | 2010-04-10 | kid_number | D | 8% | 6회 | 750,000 |
(3) 고객의 생일의 일이 10인 데이터 찾기
고객생년월일은 연-월-일 순으로 구성되는데 이때 일이 10인 데이터를 찾기 위해 패턴 앞에 % 를 추가했다.
SELECT *
FROM SAVING_DATA
WHERE 고객생년월일 LIKE '%10'
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납입금액 |
|---|---|---|---|---|---|---|---|
| KW_0002 | Haily | 2010-04-10 | kid_number | D | 8% | 6회 | 750,000 |
(4) 적금금리가 2자리 수인 데이터 찾기
언더바(_)를 두 개 입력하여 금리가 2자리 수임을 지정하고, % 앞에 \를 추가하여 %도 찾아야하는 패턴에 추가했다.
적금금리가 1 ~ 2자리만 있다는 점을 고려하면 WHERE 적금금리 LIKE '__%'로 원하는 데이터를 불러올 수 있다.
SELECT *
FROM SAVING_DATA
WHERE 적금금리 LIKE '__\%'
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납입금액 |
|---|---|---|---|---|---|---|---|
| AM_0003 | Nini | 1922-02-02 | 010-3456-** | C | 11% | 20회 | 13,500,000 |
(5) 총납입액이 100만원 이상 1000만원 미만인 고객 데이터 찾기
100만원(1,000,000)은 , 기호 포함 9자리의 문자열로 구성되어있다.
이 점을 이용해 자릿수가 9자리인 데이터를 추출기 위해 언더바(_) 9개인 패턴을 사용했다.
SELECT *
FROM SAVING_DATA
WHERE 총납입금액 LIKE '_________'
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납임금액 |
|---|---|---|---|---|---|---|---|
| AW_0001 | Ella | 1992-11-12 | 010-1234-** | A | 6% | 3회 | 2,000,000 |
| AM_0002 | Micle | 1954-01-03 | 010-2345-** | A | 6% | 11회 | 1,450,000 |
| AW_0004 | Jacob | 1985-09-22 | 010-4567-** | B | 5% | 10회 | 5,000,000 |
✔️ REGEXP 연산자
- 기본 구조 :
SELECT [필드명] FROM [테이블명] WHERE [필드명] REGEXP '정규식' - WHERE 절 안에서 정규식을 이용해 특정 문자에 대한 데이터를 찾을 때 사용
- 특정 규칙을 가진 문자열의 집합(정규표현식)으로 원하는 데이터를 가져올 수 있음
1. 정규식 기호
(1) 매칭(Matching) 패턴
| 패턴 | 기능 | 예시 | 예시 설명 |
|---|---|---|---|
| . | 문자 하나 | ’..’ | 문자열 길이가 두 글자인 문자열을 찾음 |
| | | 또는(or) | ‘G|W’ | ‘G’나 ‘W’ 인 문자열을 찾음 |
| [] | []안에 나열된 패턴에 해당하는 문자열 | ‘[Aa]’ | ‘A’나 ‘a’인 문자열을 찾음 |
| ^ | 시작하는 문자열 | ‘^ID’ | ID로 시작하는 문자열을 찾음 |
| $ | 끝나는 문자열 | ‘A$’ | A로 끝나는 문자열을 찾음 |
(2) 횟수(Times) 패턴
| 패턴 | 기능 | 예시 | 예시 설명 |
|---|---|---|---|
| * | 0회 이상 나타나는 문자 | ‘a*’ | ‘a’가 0번 이상 등장하는 문자열을 찾음. ‘apple’, ‘apart’, ‘biz’ 모두 해당 |
| + | 1회 이상 나타나는 문자 | ‘a+’ | ‘a’가 1번 이상 등장하는 문자열을 찾음. ‘app’, ‘banana’ 모두 해당 |
| {m, n} | m회 이상 n회 이하 나타나는 문자 | ‘박{1,2}’ | ‘박’이 1회 이상 2회 이하 등장하는 문자열을 찾음. ‘박수’, ‘박수박수’, ‘박소리’ 모두 해당 |
| ? | 0~1회 나타나는 문자 | ‘김?’ | ‘김’이 0~1회 등장하는 문자열을 찾음. ‘김밥’, ‘나라’ 모두 해당 |
(3) 그룹 형태(Group) 패턴
| 패턴 | 기능 | 예시 | 예시 설명 |
|---|---|---|---|
| [A-z] 또는 [:alpha:] 또는 \a | 알파벳 대문자 또는 소문자인 문자열을 찾음 | ‘\a’ | 알파벳이 한 개 이상인 문자열을 찾음 |
| [0-9] 또는 [:digit:] 또는 \d | 숫자인 문자열을 찾음 | ’[:digit:]’ | 숫자가 한 개 이상인 문자열을 찾음 |
| [^문자] | 괄호 안의 문자를 포함하지 않은 문자열을 찾음 | ’[^김이최]’ | ‘김’, ‘이’, ‘최’를 포함하지 않는 문자열을 찾음 |
2. 예시로 이해하기
데이터(SAVING_DATA)는 임의로 만든 것이며 고객ID에서 A(성인), K(어린이), M(남성), W(여성)을 의미하며 고객전화번호에 어린이는 kid_number 라는 문자열을 포함한다.
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납입금액 |
|---|---|---|---|---|---|---|---|
| AW_0001 | Ella | 1992-11-12 | 010-1234-** | A | 6% | 3회 | 2,000,000 |
| AM_0002 | Micle | 1954-01-03 | 010-2345-** | A | 6% | 11회 | 1,450,000 |
| AM_0003 | Nini | 1922-02-02 | 010-3456-** | C | 11% | 20회 | 13,500,000 |
| AW_0004 | Jacob | 1985-09-22 | 010-4567-** | B | 5% | 10회 | 5,000,000 |
| KM_0001 | Max | 2008-10-20 | kid_number | D | 8% | 1회 | 100,000 |
| KW_0002 | Haily | 2010-04-10 | kid_number | D | 8% | 6회 | 750,000 |
(1) 2000년생 고객 데이터 찾기
고객생년월일의 앞자리가 1이 아닌 2로 시작되는 데이터를 추출하기 위해 ^ 기호를 사용했다.
SELECT *
FROM SAVING_DATA
WHERE 고객생년월일 REGEXP '^2'
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납입금액 |
|---|---|---|---|---|---|---|---|
| KM_0001 | Max | 2008-10-20 | kid_number | D | 8% | 1회 | 100,000 |
| KW_0002 | Haily | 2010-04-10 | kid_number | D | 8% | 6회 | 750,000 |
(2) A 또는 C 적금상품을 가입자 데이터 찾기
적금상품ID가 A 또는 C 인 데이터를 추출하기 위해 ‘또는’ 기능을 하는 | 기호를 사용했다.
SELECT *
FROM SAVING_DATA
WHERE 적금상품ID REGEXP 'A|B'
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납입금액 |
|---|---|---|---|---|---|---|---|
| AW_0001 | Ella | 1992-11-12 | 010-1234-** | A | 6% | 3회 | 2,000,000 |
| AM_0002 | Micle | 1954-01-03 | 010-2345-** | A | 6% | 11회 | 1,450,000 |
| AW_0004 | Jacob | 1985-09-22 | 010-4567-** | B | 5% | 10회 | 5,000,000 |
(3) 적금 납입을 10회 이상한 고객 데이터 찾기
적금 납입횟수가 10회 이상, 즉 ‘회’를 제외한 나머지 글자 수는 2자리임을 .을 이용해 아래 코드를 완성했다.
SELECT *
FROM SAVING_DATA
WHERE 총납입횟수 REGEXP '^..회$'
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납입금액 |
|---|---|---|---|---|---|---|---|
| AM_0002 | Micle | 1954-01-03 | 010-2345-** | A | 6% | 11회 | 1,450,000 |
| AM_0003 | Nini | 1922-02-02 | 010-3456-** | C | 11% | 20회 | 13,500,000 |
| AW_0004 | Jacob | 1985-09-22 | 010-4567-** | B | 5% | 10회 | 5,000,000 |
(4) 이름이 M,N으로 시작되지않는 고객 데이터 찾기
이름이 M, N으로 시작되지 않는 데이터를 추출하기 위해 ^([^MmNn]) 를 사용했다.
SELECT *
FROM SAVING_DATA
WHERE 고객명 REGEXP '^([^MmNn])'
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납입금액 |
|---|---|---|---|---|---|---|---|
| AW_0001 | Ella | 1992-11-12 | 010-1234-** | A | 6% | 3회 | 2,000,000 |
| AW_0004 | Jacob | 1985-09-22 | 010-4567-** | B | 5% | 10회 | 5,000,000 |
| KW_0002 | Haily | 2010-04-10 | kid_number | D | 8% | 6회 | 750,000 |
(5) 이름이 모음으로 시작하고 모음으로 끝나는 고객 데이터 찾기
이름이 모음 한 자리인 경우를 포함 (^[AEIOUaeiou]$)
이름이 모음으로 시작하고 모음으로 끝나는데 글자수가 1자리 이상인 경우 포함 (^[AEIOUaeiou]$.*[AEIOUaeiou])
두 경우를 | 로 묶어서 조건을 만들었다.
SELECT *
FROM SAVING_DATA
WHERE 고객명 REGEXP '^[AEIOUaeiou]($|.*[AEIOUaeiou])'
| 고객ID | 고객명 | 고객생년월일 | 고객전화번호 | 적금상품ID | 적금금리 | 총납입횟수 | 총납입금액 |
|---|---|---|---|---|---|---|---|
| AW_0001 | Ella | 1992-11-12 | 010-1234-** | A | 6% | 3회 | 2,000,000 |
✔️ Reference
- 네이버블로그 by 포크다, WHERE 활용법 3 (LIKE 연산자, 와일드카드)
- 티스토리 bt foreverever, [MySQL] 특정 문자포함 검색 (LIKE & REGEXP)
- 티스토리 by 코딩하는 금융인, [MySQL] 정규표현식 검색하기 REGEXP, LIKE
- steemit by seobangnim, [MySQL] 정규식을 이용한 검색 regexp
- Medium by jjin, 핵심만 정리한 MYSQL 정규표현식
👩🏻💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.
댓글남기기