SQL 정규표현식
SQL에서도 정규표현식을 사용할 수 있습니다.
보통 문자열 검색은 LIKE를 많이 쓰지만, 정규표현식을 사용하면 이메일, 전화번호, 숫자, 문자 패턴 검증 등 더 정교하게 처리할 수 있습니다.
1. Anchor (위치 지정자)
Anchor는 문자열의 시작과 끝을 지정합니다.
| 기호 | 의미 | 예제 | 설명 |
| ^ | 문자열 시작 | ^A | 이름이 A로 시작 (Anna ✅ / Brian ❌) |
| $ | 문자열 끝 | z$ | 이름이 z로 끝 (Buzz ✅ / Alice ❌) |
| \b | 단어 경계 | \bword\b | "word"가 단어 단위로 존재 |
-- 이름이 A로 시작하고 z로 끝나는 경우
SELECT *
FROM users
WHERE name REGEXP '^A.*z$';
- ^A.*z$ → 시작은 A, 끝은 z, 중간은 어떤 문자든 가능
2. Quantifier (반복 지정자)
Quantifier는 문자가 몇 번 반복되는지 지정합니다.
| 기호 | 의미 | 예제 | 설명 |
| + | 1회 이상 반복 | a+ | "a", "aa", "aaa" |
| * | 0회 이상 반복 | a* | "", "a", "aa" |
| {n} | 정확히 n회 | \d{3} | 숫자 3자리만 |
| {n,} | n회 이상 | \d{3,} | 최소 숫자 3자리 |
| {n,m} | n~m회 | \d{2,4} | 2~4자리 숫자 |
-- 숫자가 3자리 이상인 전화번호 조회
SELECT *
FROM users
WHERE phone REGEXP '^[0-9]{3,}$';
3. Capturing Group (그룹화)
괄호 ( )로 패턴을 묶어 특정 부분만 추출하거나 반복 적용할 수 있습니다.
-- 전화번호에서 지역번호(앞 3자리)만 추출
SELECT REGEXP_SUBSTR(phone, '([0-9]{3})-[0-9]{3,4}-[0-9]{4}', 1, 1, '', 1) AS area_code
FROM users;
- ([0-9]{3}) → 그룹으로 묶어 첫 번째 3자리 숫자만 추출
4. Character Class (문자 클래스)
문자 클래스는 특정 문자 집합을 지정합니다.
| 표현 | 의미 | 예제 |
| [abc] | a, b, c 중 하나 | [A-C] = A~C |
| [0-9] | 숫자 | [0-9]{3} → 숫자 3자리 |
| [a-z] | 소문자 | [a-z]+ → 소문자 연속 |
| [^abc] | a, b, c 제외 | [^0-9] → 숫자 제외 |
-- 영문자와 숫자로만 된 아이디
SELECT *
FROM users
WHERE username REGEXP '^[a-zA-Z0-9]+$';
5. Character Class Escape (축약 표현)
자주 쓰이는 문자 집합을 간단히 표현 가능
| Escape |
의미 | 예제 |
| \d | 숫자 [0-9] | \d{3,} → 최소 3자리 숫자 |
| \D | 숫자가 아닌 문자 | \D+ → 숫자 제외 |
| \w | 단어 문자 [a-zA-Z0-9_] | \w+ → 알파벳/숫자/_ |
| \W | 단어 문자가 아닌 문자 | \W+ → 특수문자만 |
| \s | 공백 문자 | \s* → 공백 0회 이상 |
| \S | 공백이 아닌 문자 | \S+ → 연속된 공백 아닌 문자 |
-- 숫자만 포함된 주문번호
SELECT *
FROM orders
WHERE order_code REGEXP '^\d+$';
6. 다양한 실무 예제
-- 1. 이메일 형식
SELECT *
FROM users
WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';
-- 2. 휴대폰 번호 010-1234-5678
SELECT *
FROM users
WHERE phone REGEXP '^01[0-9]-[0-9]{3,4}-[0-9]{4}$';
-- 3. 한글 이름만
SELECT *
FROM users
WHERE name REGEXP '^[가-힣]+$';
-- 4. 특정 문자로 시작, 특정 문자로 끝
SELECT *
FROM items
WHERE code REGEXP '^A.*Z$';
-- 5. 숫자 3~5자리
SELECT *
FROM orders
WHERE order_code REGEXP '^\\d{3,5}$';
-- 6. 공백 포함/미포함 체크
SELECT *
FROM comments
WHERE comment REGEXP '^\\S+$'; -- 공백 없는 문자열
SELECT *
FROM comments
WHERE comment REGEXP '^\\s*$'; -- 공백만 있는 문자열
-- 7. 특수문자 포함 여부
SELECT *
FROM passwords
WHERE password REGEXP '[!@#$%^&*]';
-- 8. 영문+숫자 혼합
SELECT *
FROM users
WHERE username REGEXP '^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]+$';
-- 9. 단어 단위 검색
SELECT * FROM articles
WHERE content REGEXP '\\bSQL\\b'; -- SQL 단어만 매칭
-- 10. IPv4 주소 형식
SELECT *
FROM network
WHERE ip_address REGEXP CONCAT(
'^(25[0-5]|2[0-4][0-9]|[01]?\\d\\d?)\\.',
'(25[0-5]|2[0-4][0-9]|[01]?\\d\\d?)\\.',
'(25[0-5]|2[0-4][0-9]|[01]?\\d\\d?)\\.',
'(25[0-5]|2[0-4][0-9]|[01]?\\d\\d?)$'
);
7. 핵심 요약
- ^, $ → 문자열 시작/끝
- Quantifier → 반복 횟수 {n}, {n,}, +, *
- Capturing Group → ( )로 부분 추출
- Character Class → [a-z], [0-9], [^abc]
- Escape Class → \d, \w, \s
- 실무 활용 → 이메일, 전화번호, 공백, 특수문자, IP 등 검증
'데이터 분석 > SQL' 카테고리의 다른 글
| SQL 서브쿼리 정리 / WHERE, FROM, SELECT, WITH 활용법 (1) | 2025.09.01 |
|---|