PM 트랙_강의/SQL

MySQL - 문자열 내 특정 문구 추출

은하_carol 2024. 12. 25. 00:54

 

목적: customers 테이블에서 사용자의 이메일 주소 중 도메인 내 키워드만 추출한다.

 

먼저 customers 테이블을 전체 조회하여 어떤 데이터들이 있는지 확인해 봅니다.

 

▼ 쿼리

select *
from customers
 

▼ 결과

 

컬럼이 총 5개가 있는 걸 확인할 수 있습니다.

  • customer_id: 고객 번호
  • name: 고객 이름
  • email: 고객 이메일 주소
  • gender: 고객 성별
  • age: 고객 나이

 

조회에 필요한 건 고객 이름(name)과 고객 이메일 주소(email)입니다.

 

접근 방법은 다양합니다.

 

방법 1. like 구문을 활용한다.

▼ 쿼리

select name,
case when email like '%@hanmail.com' then 'hanmail'
	 when email like '%@daum.net' then 'daum'
	 when email like '@naver.com' then 'naver'
	 else 'etc'
end as domain
from customers
 

▼ 결과

실제 데이터를 확인하면 문제점을 더욱 쉽게 파악할 수 있습니다.

문제점 1. 이메일 주소 데이터가 한정적이지 않을 경우 모두 처리하기 어렵다.

               모든 도메인을 case when 구문에 작성해야 한다.

문제점 2. like 조건에 작성할 키워드가 간단한 경우('%@naver.com'이 아니고 '%naver%')

               'naver123@daum.net'과 같은 이메일 주소를 처리하기 어렵다.

문제점 3. like 구문의 성능 문제에 직면할 수 있다.

 

문제점 3에 대한 관련 자료는 아래를 읽어 보시기 바랍니다.

https://velog.io/@juhyeon1114/MySQL-검색-성능-개선하기-like와-full-text-search

 

[MySQL] 검색 성능 개선하기 : LIKE와 Full-Text Search

검색 성능 개선하기

velog.io

 

 

방법 2. 정규식을 활용한다.

▼ 쿼리

select name,
	REGEXP_REPLACE(substr(email,locate('@',email) + 1),'\\.com|\\.net', '') as domain
from customers
 

▼ 결과

문제점 1. 정규식에 작성한 조건식 또한 하드 코딩으로, '.com', '.net' 외의 것이 있는 경우 지속적으로 추가해야 한다.

 

방법 3. 문자열을 특수문자에 따라 자른다.

▼ 쿼리

select name,
	substring_index(substring(email, locate('@', email) + 1), '.', 1) as "domain"
from customers
 

▼ 결과

문제점 1. SQL 함수를 조합하여 활용해야 하므로 쿼리문 작성이 어렵다.

 

 

정답은 없습니다.

PM의 역량 중 SQL 능력이 필요하다면 직접 효율적인 쿼리를 짜 데이터를 확인하는 것이 아닌,

데이터베이스를 어떻게 활용해서 어떤 데이터를 추출할 수 있는지 알고 있는 걸로 충분하지 않을까 생각됩니다.