[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 정규표현식
👩🏻💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.
댓글남기기