MySQL SUBSTRING() 설명: 문자열의 일부를 추출하는 방법과 예시

1. SUBSTRING 함수란 무엇인가요?

SUBSTRING 함수는 문자열에서 부분 문자열을 추출하는 데 사용되는 중요한 MySQL 함수입니다. 이 함수를 사용하면 데이터베이스에 저장된 데이터 중 필요한 부분만 꺼낼 수 있습니다. 예를 들어, 사용자의 이메일 주소에서 도메인 부분을 추출하거나 제품 코드의 특정 구간을 가져올 때 유용합니다.

1.1 기본 구문

SUBSTRING 함수의 기본 구문은 다음과 같습니다:

SUBSTRING(str, pos)
SUBSTRING(str, pos, len)
  • str : 추출할 문자열.
  • pos : 시작 위치(1부터 시작).
  • len : 추출할 문자 수(선택 사항).

pos가 양수이면 MySQL은 문자열의 시작부터 앞으로 카운트합니다. 음수이면 문자열의 끝에서부터 뒤로 카운트합니다. len을 생략하면 MySQL은 지정된 위치부터 문자열 끝까지 추출합니다.

1.2 SUBSTRING 함수 사용 사례

이 함수는 문자열 데이터를 포맷하고 특정 부분을 추출하는 데 사용되어, 데이터베이스에서 정보를 보다 효율적으로 검색하고 처리할 수 있게 해줍니다.

2. SUBSTRING 함수 기본 사용법

기본을 이해하기 위해 몇 가지 간단한 예제를 살펴보겠습니다.

2.1 문자열의 일부 추출

다음 쿼리는 문자열 “Hello, World!”에서 3번째 문자부터 6자를 추출합니다.

SELECT SUBSTRING('Hello, World!', 3, 6);

결과는 "llo, W" 입니다. pos가 3이므로 3번째 문자부터 추출이 시작되고, len이 6이므로 6개의 문자가 추출됩니다.

2.2 길이 매개변수 생략

len을 생략하면 MySQL은 지정된 위치부터 문자열 끝까지 추출합니다.

SELECT SUBSTRING('Hello, World!', 8);

결과는 "World!" 로, 8번째 문자부터 끝까지 모든 문자를 가져옵니다.

2.3 음수 위치 사용

음수 값을 사용하면 문자열 끝에서부터 위치를 지정할 수 있습니다.

SELECT SUBSTRING('Hello, World!', -5);

이 쿼리는 "orld!" 를 반환하며, 마지막 5자를 추출합니다.

3. SUBSTRING 함수 실무 적용 예시

SUBSTRING 함수는 실제 데이터 작업에서 자주 사용됩니다. 아래는 실용적인 예시들입니다.

3.1 이메일 주소에서 도메인 추출

SUBSTRINGLOCATE를 결합하면 이메일 주소에서 도메인 부분을 추출할 수 있습니다.

SELECT email, SUBSTRING(email, LOCATE('@', email) + 1) AS domain FROM users;

이 쿼리는 “@” 뒤의 문자열을 추출하여 도메인 부분만 반환합니다.

3.2 제품 코드의 일부 추출

다음 예시는 제품 코드의 특정 구간을 추출합니다.

SELECT product_code, SUBSTRING(product_code, 5, 4) AS product_id FROM products;

이 쿼리는 제품 코드의 5번째 문자부터 4자를 추출하여 product_id라는 새 컬럼에 표시합니다.

3.3 서브쿼리에서 사용

서브쿼리와 결합하면 보다 복잡한 조건에서 데이터를 추출할 수 있습니다.

SELECT id, SUBSTRING(description, 1, 10) AS short_desc FROM (SELECT * FROM products WHERE category = 'Electronics') AS sub;

이 쿼리는 category가 ‘Electronics’인 제품들 중 description의 앞 10자를 추출합니다.

4. 다른 문자열 함수와의 비교

SUBSTRING과 유사한 목적에 사용할 수 있는 다른 함수로는 LEFT, RIGHT, SUBSTR 등이 있습니다.

4.1 LEFTRIGHT 함수

  • LEFT(str, len) : 문자열의 시작부터 지정된 수만큼의 문자를 반환합니다.
  • RIGHT(str, len) : 문자열의 끝부터 지정된 수만큼의 문자를 반환합니다.
    SELECT LEFT('Hello, World!', 5);  -- "Hello"
    SELECT RIGHT('Hello, World!', 6); -- "World!"
    

이 함수들은 문자열의 시작이나 끝에서 부분 문자열을 추출하고자 할 때 편리합니다.

4.2 SUBSTR 함수

SUBSTRSUBSTRING의 별칭이므로 동일하게 사용할 수 있습니다.

SELECT SUBSTR('Hello, World!', 8); -- "World!"

이 쿼리는 SUBSTRING과 마찬가지로 "World!"를 반환합니다.

5. SUBSTRING 함수의 고급 사용법 및 최적화

이 섹션에서는 더 고급적인 사용법과 최적화 기법을 설명합니다.

5.1 성능 최적화

대규모 데이터셋에서 SUBSTRING을 사용하면 성능에 영향을 줄 수 있습니다. 필요 시 인덱스를 생성하고 쿼리 실행 계획을 확인하세요. 또한, 동일한 부분 문자열을 자주 추출한다면 결과를 캐싱하는 것을 고려하세요.

5.2 WHERE 절에서 사용하기

WHERE 절에서 SUBSTRING을 사용하여 부분 문자열 조건에 기반한 레코드를 필터링할 수 있습니다.

SELECT * FROM products WHERE SUBSTRING(product_code, 1, 3) = 'ABC';

이 쿼리는 product_code의 처음 3자리가 ‘ABC’인 제품을 검색합니다.

6. SUBSTRING 함수의 예제 및 모범 사례

여기서는 SUBSTRING을 사용하는 실용적인 예제와 실제 작업을 위한 모범 사례를 소개합니다.

6.1 샘플 코드

다음 샘플은 고객의 전체 이름을 이름과 성으로 분리합니다.

SELECT name, SUBSTRING(name, 1, LOCATE(' ', name) - 1) AS first_name,
       SUBSTRING(name, LOCATE(' ', name) + 1) AS last_name
FROM customers;

이 쿼리에서는 공백으로 구분된 전체 이름에서 이름과 성을 추출합니다.

6.2 모범 사례

  • 필요한 부분만 추출하세요 : 성능 영향을 최소화하기 위해 부분 문자열 길이를 가능한 한 작게 유지하세요.
  • 데이터 유형에 주의하세요 : 숫자 데이터에 SUBSTRING을 적용할 경우 문자열로 명시적으로 캐스팅해야 할 수 있습니다.
  • 인덱스 사용을 고려하세요 : WHERE 절에서 SUBSTRING을 사용할 때 인덱스가 효과적으로 사용되지 않을 수 있으므로 쿼리 성능을 주의 깊게 모니터링하세요.

7. 오류 처리 및 버전 차이

이 섹션에서는 SUBSTRING 사용 시 오류 처리와 MySQL 버전 간 차이를 다룹니다.

7.1 오류 처리

지정된 위치가 문자열 범위를 벗어나면 SUBSTRING은 빈 문자열을 반환합니다. 이는 오류가 아니므로 필요 시 결과를 미리 검증하는 로직을 추가하는 것이 좋습니다.

7.2 버전 차이

MySQL 버전에 따라 SUBSTRING 함수의 동작이 다를 수 있습니다. 예를 들어, 일부 오래된 버전에서는 다중 바이트 문자를 다르게 처리할 수 있습니다. 버전 간 호환성을 확인하고 필요 시 적절한 조치를 적용하세요.