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


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기