
SQL 내가 틀린 것들 #60 — SUBSTRING, CONCAT, SUBSTRING_INDEX 문자열 다루기
💡 문자열 함수 3총사!
| 함수 | 역할 |
|---|
| SUBSTRING | 문자열 일부 추출 |
| CONCAT | 문자열 합치기 |
| SUBSTRING_INDEX | 구분자 기준으로 자르기 |
1️⃣ SUBSTRING — 일부 추출
문법
SUBSTRING(문자열, 시작위치, 길이)
⚠️ SQL은 1부터 시작! (0 아님!)
예시
SUBSTRING('01012345678', 1, 7) → '0101234'
SUBSTRING('19900315', 1, 4) → '1990'
SUBSTRING('19900315', 5, 2) → '03'
SUBSTRING('19900315', 7, 2) → '15'
실전: 전화번호 마스킹
SELECT
name,
CONCAT(SUBSTRING(phone, 1, 7), '****') AS masked_phone
FROM users
| name | masked_phone |
|---|
| 김철수 | 0101234**** |
2️⃣ CONCAT — 문자열 합치기
문법
CONCAT(문자열1, 문자열2, 문자열3, ...)
예시
CONCAT('Hello', ' ', 'World') → 'Hello World'
CONCAT('1990', '-', '03', '-', '15') → '1990-03-15'
⚠️ 주의: CONCAT 안에서 별칭(AS) 못 씀!
CONCAT(
SUBSTRING(birth_date, 1, 4) AS year,
'-',
SUBSTRING(birth_date, 5, 2) AS month
) AS formatted_date
CONCAT(
SUBSTRING(birth_date, 1, 4),
'-',
SUBSTRING(birth_date, 5, 2),
'-',
SUBSTRING(birth_date, 7, 2)
) AS formatted_date
실전: 생년월일 포맷 변환
SELECT
name,
CONCAT(
SUBSTRING(birth_date, 1, 4),
'-',
SUBSTRING(birth_date, 5, 2),
'-',
SUBSTRING(birth_date, 7, 2)
) AS formatted_date
FROM customers
| name | formatted_date |
|---|
| 김철수 | 1990-03-15 |
3️⃣ SUBSTRING_INDEX — 구분자 기준 자르기
문법
SUBSTRING_INDEX(문자열, 구분자, N)
양수 = 앞에서부터, 음수 = 뒤에서부터!
예시: 이메일 'kim@gmail.com'
SUBSTRING_INDEX('kim@gmail.com', '@', 1) → 'kim'
SUBSTRING_INDEX('kim@gmail.com', '@', -1) → 'gmail.com'
구분자가 여러 개일 때: 'a@b@c'
| N | 의미 | 결과 |
|---|
| 1 | 첫 번째 @ 앞 | a |
| 2 | 두 번째 @ 앞까지 전부 | a@b |
| -1 | 마지막 @ 뒤 | c |
| -2 | 뒤에서 두 번째 @ 뒤부터 전부 | b@c |
실전: 이메일 아이디 추출
SELECT
email,
SUBSTRING_INDEX(email, '@', 1) AS email_id
FROM members
| email | email_id |
|---|
| kim@gmail.com | kim |
⚠️ 내가 틀린 것들
| 실수 | 정답 |
|---|
| SUBSTRING(phone, 0, 7) | SUBSTRING(phone, 1, 7) — 1부터! |
| CONCAT(..., ****) | CONCAT(..., '**'**) — 따옴표! |
| CONCAT 안에 AS 별칭 | 안에서 AS 못 씀! 밖에서 1개만! |
| SUBSTRING_INDEX(email, '@', 2) | -1 써야 뒷부분! |
📌 정리
| 하고 싶은 것 | 함수 |
|---|
| 문자열 일부 추출 | SUBSTRING(문자열, 시작, 길이) |
| 문자열 합치기 | CONCAT(a, b, c) |
| 구분자로 앞부분 | SUBSTRING_INDEX(문자열, 구분자, 1) |
| 구분자로 뒷부분 | SUBSTRING_INDEX(문자열, 구분자, -1) |
| 시작 위치 | 1부터! |
| 문자열 값 | 따옴표 필수! |
문자열 = SUBSTRING + CONCAT + SUBSTRING_INDEX! 💪
