데이터 분석/SQL

SQL 정규표현식 쉽게 이해하기

haru124 2025. 9. 23. 16:58

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 등 검증