[SQL] 정규표현식 함수

Hyunjun Kim·2024년 10월 2일
0

SQL

목록 보기
10/44

프로그래머스 문제를 풀다가 Regualr Expression ( 정규표현식) 함수를 알게 되었다.


문제 : 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

REGEXP를 사용해 간결하게 코드를 짤 수 있는 장점이 있다.

MySQL 정규표현식 함수 종류 및 설명

함수 이름설명사용 예시
REGEXP / RLIKE정규표현식과
일치하는지 확인
SELECT * FROM users WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}$';
REGEXP_
LIKE
정규표현식 일치여부 Boolean 반환SELECT REGEXPLIKE(email, '^[A-Za-z0-9.%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}$') AS is_valid FROM users;
REGEXP_
REPLACE
정규표현식과
일치부분을 대체
SELECT REGEXP_REPLACE(phone_number, '[^0-9]', '')
AS clean_phone FROM contacts;
REGEXP_
SUBSTR
정규표현식과
일치부분 추출
SELECT REGEXP_SUBSTR(description, '[A-Za-z]+')
AS first_word FROM products;
REGEXP_
INSTR
정규표현식 일치부분의 시작 위치 반환SELECT REGEXP_INSTR(email, '@')
AS at_position FROM users;
REGEXP_COUNT정규표현식 일치하는 패턴의 개수SELECT REGEXP_COUNT(description, 'engineer')
AS engineer_count FROM jobs;



MySQL 정규표현식 함수 상세 설명

REGEXP / RLIKE

REGEXP와 RLIKE는 동일한 기능을 제공하며, 문자열이 지정된 정규표현식과 일치하는지 여부를 확인하는 데 사용됩니다. 주로 WHERE 절에서 조건부 필터링에 사용됩니다.

-- 이메일 형식이 유효한 사용자 조회
SELECT email
FROM users
WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';

REGEXP_LIKE

REGEXP_LIKE는 REGEXP와 유사하게 문자열이 정규표현식과 일치하는지 여부를 반환하지만, 함수 형태로 사용됩니다.

-- 전화번호 형식이 유효한지 확인
SELECT phone_number
FROM contacts
WHERE REGEXP_LIKE(phone_number, '^\d{3}-\d{4}-\d{4}$');

REGEXP_REPLACE

REGEXP_REPLACE는 문자열 내에서 정규표현식과 일치하는 부분을 다른 문자열로 대체하는 함수

-- 전화번호에서 비숫자 문자 제거
SELECT REGEXP_REPLACE(phone_number, '[^0-9]', '') AS clean_phone
FROM contacts;

REGEXP_SUBSTR

REGEXP_SUBSTR는 문자열에서 정규표현식과 일치하는 부분 문자열을 추출하는 함수

-- 설명에서 첫 번째 단어 추출
SELECT REGEXP_SUBSTR(description, '[A-Za-z]+') AS first_word
FROM products;

REGEXP_INSTR

REGEXP_INSTR는 문자열 내에서 정규표현식과 일치하는 부분의 시작 위치를 반환하는 함수

-- 이메일에서 '@' 기호의 위치 찾기
SELECT REGEXP_INSTR(email, '@') AS at_position
FROM users;

REGEXP_COUNT

REGEXP_COUNT는 문자열에서 정규표현식과 일치하는 패턴의 개수를 세는 함수

-- 설명에서 'engineer'라는 단어의 개수 세기
SELECT REGEXP_COUNT(description, 'engineer') AS engineer_count
FROM jobs;

정규표현식 연습 문제

문제 1

사용자 테이블에서 'a'로 시작하는 이메일 주소를 가진 사용자를 조회하세요.

테이블 구조:

  • users
    - user_id: 사용자 ID
    - email: 이메일 주소
SELECT email
FROM users
WHERE email REGEXP '^a';

문제 2

연락처 테이블에서 '(123)' 형식의 전화번호를 가진 연락처를 조회하세요.

테이블 구조:

  • contacts
    - contact_id: 연락처 ID
    - phone_number: 전화번호
SELECT phone_number
FROM contacts
WHERE phone_number REGEXP '^\\(123\\)';

문제 3

사용자 테이블에서 'example.com' 도메인을 가진 이메일 주소를 조회하세요.

테이블 구조:

  • users
    - user_id: 사용자 ID
    - email: 이메일 주소
SELECT email
FROM users
WHERE email REGEXP '@example\\.com$';

문제 4

주문 테이블에서 'YYYY-MM-DD' 형식의 날짜를 가진 주문을 조회하세요.

테이블 구조:

  • orders
    - order_id: 주문 ID
    - order_date: 주문 날짜
SELECT order_id, order_date
FROM orders
WHERE order_date REGEXP '^[0-9]{4}-[0-9]{2}-[0-9]{2}$';

문제 6

제품 설명에서 모든 숫자를 '#' 문자로 대체하여 새로운 열로 표시하세요.

테이블 구조:

  • products
    - product_id: 제품 ID
    - description: 제품 설명
SELECT product_id, REGEXP_REPLACE(description, '[0-9]', '#')
       AS updated_description
FROM products;

문제 7

사용자 테이블에서 이메일 주소에서 '@' 이전의 사용자 이름만 추출하여 새로운 열로 표시하세요.

테이블 구조:

  • users
    - user_id: 사용자 ID
    - email: 이메일 주소
SELECT user_id,
       REGEXP_SUBSTR(email, '^[^@]+') AS username
FROM users;

문제 8

직원 테이블에서 이메일 주소의 도메인을 'newdomain.com'으로 변경하여 새로운 열로 표시

테이블 구조:

  • users
    - user_id: 사용자 ID
    - email: 이메일 주소
SELECT employee_id, email,
       REGEXP_REPLACE(email, '@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$', '@newdomain.com') 
       AS updated_email
FROM employees;

문제 9

사용자 테이블에서 이메일 주소에서 '@' 이전의 사용자 이름만 추출하여 새로운 열로 표시하세요.

테이블 구조:

  • products
    - product_id: 제품 ID
    - description: 제품 설명
SELECT product_id,
       description,
       REGEXP_COUNT(description, 'eco') AS eco_count
FROM products;

문제 10

사용자 테이블에서 이메일 주소가 'example.com' 또는 'test.com' 도메인을 가진 사용자만 조회하세요.

테이블 구조:

  • users
    - user_id: 사용자 ID
    - email: 이메일 주소
SELECT user_id, email
FROM users
WHERE email REGEXP '(@example\\.com$|@test\\.com$)';

0개의 댓글