취준이랄까../SQLD

my sql, 정규표현식

넹넹선생님 2024. 10. 31. 11:50
728x90
반응형

SQL 정규표현식을 사용하는 문제는 데이터베이스에서 특정 패턴을 찾거나 특정 형식을 검증하는 데 주로 사용됩니다. SQL에서 정규표현식을 지원하는 데이터베이스(예: MySQL, PostgreSQL)에서는 `REGEXP`(또는 `SIMILAR TO`)와 같은 키워드를 사용하여 정규표현식을 사용할 수 있습니다. 아래는 SQL 정규표현식을 활용한 문제의 예시와 그에 대한 설명입니다.

---

### 1. 이메일 형식 검증 문제

**문제**  
직원 테이블에서 이메일 형식이 올바르지 않은 레코드를 찾으세요. 이메일은 `username@domain.com` 형식을 따라야 하며, `username`은 영문자, 숫자, `.` 또는 `_` 문자로 구성될 수 있고, `domain`은 영문자와 숫자로만 이루어져야 합니다.

**예시 쿼리 (MySQL)**

```sql
SELECT employee_id, email
FROM employees
WHERE email NOT REGEXP '^[a-zA-Z0-9._]+@[a-zA-Z0-9]+\\.[a-zA-Z]{2,}$';
```

**설명**  
정규표현식 `^[a-zA-Z0-9._]+@[a-zA-Z0-9]+\\.[a-zA-Z]{2,}$`은 다음을 의미합니다.
- `^[a-zA-Z0-9._]+`: 이메일의 `username` 부분은 영문자, 숫자, `.`, `_`를 포함하여 하나 이상의 문자로 구성됩니다.
- `@[a-zA-Z0-9]+`: `@` 뒤의 `domain` 부분은 영문자와 숫자만 포함해야 합니다.
- `\\.[a-zA-Z]{2,}$`: `.` 뒤에 최소 2글자의 영문자가 와야 합니다(예: `.com`, `.net` 등).

---

### 2. 전화번호 형식 검증 문제

**문제**  
고객 테이블에서 전화번호 형식이 올바르지 않은 레코드를 찾으세요. 전화번호는 `(지역번호) 번호`의 형식을 따르며, 지역번호는 3자리 숫자, 번호는 7자리 숫자입니다. 예시: `(123) 4567890`.

**예시 쿼리 (MySQL)**

```sql
SELECT customer_id, phone
FROM customers
WHERE phone NOT REGEXP '^\\([0-9]{3}\\) [0-9]{7}$';
```

**설명**  
정규표현식 `^\\([0-9]{3}\\) [0-9]{7}$`은 다음을 의미합니다.
- `\\([0-9]{3}\\)`: 괄호 안에 3자리 숫자 (지역번호)
- ` [0-9]{7}$`: 공백 뒤에 7자리 숫자 (전화번호)

---

### 3. 특정 단어로 시작하는 이름 찾기

**문제**  
이름이 "John"으로 시작하는 직원 목록을 찾으세요.

**예시 쿼리 (MySQL)**

```sql
SELECT employee_id, name
FROM employees
WHERE name REGEXP '^John';
```

**설명**  
정규표현식 `^John`은 이름이 "John"으로 시작하는 경우를 찾습니다. `^`는 문자열의 시작을 의미합니다.

---

### 4. 특정 문자열 패턴을 포함하는 데이터 찾기

**문제**  
설명(description) 필드에 특정 키워드 "urgent"가 포함된 모든 작업(task)을 찾으세요. 대소문자는 구분하지 않습니다.

**예시 쿼리 (MySQL)**

```sql
SELECT task_id, description
FROM tasks
WHERE description REGEXP '(?i)urgent';
```

**설명**  
정규표현식 `(?i)urgent`는 "urgent"라는 단어가 포함된 경우를 찾으며, `(?i)`는 대소문자 구분을 무시하는 옵션입니다.

---

### 5. 특정 날짜 형식 찾기

**문제**  
주문 테이블에서 `YYYY-MM-DD` 형식이 아닌 날짜 형식으로 입력된 레코드를 찾으세요.

**예시 쿼리 (MySQL)**

```sql
SELECT order_id, order_date
FROM orders
WHERE order_date NOT REGEXP '^[0-9]{4}-[0-9]{2}-[0-9]{2}$';
```

**설명**  
정규표현식 `^[0-9]{4}-[0-9]{2}-[0-9]{2}$`은 다음을 의미합니다.
- `[0-9]{4}`: 4자리 숫자 (연도)
- `-`: 하이픈
- `[0-9]{2}`: 2자리 숫자 (월)
- `-`: 하이픈
- `[0-9]{2}$`: 2자리 숫자 (일)

이 정규표현식은 `YYYY-MM-DD` 형식을 만족하는 날짜만 찾습니다.

---

### 6. 우편번호 형식 검증 문제

**문제**  
우편번호(zip_code) 필드가 5자리 숫자가 아닌 레코드를 찾으세요.

**예시 쿼리 (MySQL)**

```sql
SELECT customer_id, zip_code
FROM customers
WHERE zip_code NOT REGEXP '^[0-9]{5}$';
```

**설명**  
정규표현식 `^[0-9]{5}$`은 5자리 숫자로만 구성된 문자열을 의미합니다. 우편번호가 5자리 숫자가 아닌 경우를 찾습니다.

---

### 7. 대문자와 소문자 형식이 맞지 않는 사용자 ID 찾기

**문제**  
사용자 테이블에서 `user_id`가 "대문자로 시작하고 나머지가 소문자인 형식"이 아닌 레코드를 찾으세요. 예시 형식: "Alice", "Bob".

**예시 쿼리 (MySQL)**

```sql
SELECT user_id
FROM users
WHERE user_id NOT REGEXP '^[A-Z][a-z]*$';
```

**설명**  
정규표현식 `^[A-Z][a-z]*$`은 다음을 의미합니다.
- `[A-Z]`: 첫 글자는 대문자
- `[a-z]*`: 이후에는 소문자가 0번 이상 반복

이 정규표현식은 "Alice"와 같은 형식을 만족하는 경우만 찾습니다.

---

이와 같이, SQL 정규표현식을 사용하여 다양한 패턴을 검사하거나 특정 형식을 찾는 문제가 나올 수 있습니다. SQL에서 정규표현식은 데이터 유효성 검증이나 특수한 검색 조건을 처리할 때 유용하게 활용됩니다.

 

 

더보기

`^`와 `$`는 정규표현식에서 **문자열의 시작과 끝을 나타내는 앵커(anchor)**입니다.

- **`^` (캐럿)**: 문자열의 **시작**을 의미합니다. 정규표현식에서 `^`는 주어진 패턴이 **문자열의 시작 부분에서 일치**해야 함을 나타냅니다.

- **`$` (달러 기호)**: 문자열의 **끝**을 의미합니다. 정규표현식에서 `$`는 주어진 패턴이 **문자열의 끝 부분에서 일치**해야 함을 나타냅니다.

따라서, `REGEXP '^[A-Z][a-z]*$'`는 다음과 같은 의미를 가집니다:

- `^`로 시작하므로 문자열이 **반드시 대문자로 시작**해야 합니다.
- `[A-Z]`: 첫 글자는 **하나의 대문자**여야 합니다.
- `[a-z]*`: 그 뒤로는 **소문자가 0개 이상** 올 수 있습니다.
- `$`로 끝나므로 문자열이 **끝까지 이 패턴을 따라야 합니다**.

즉, 이 정규표현식은 **"대문자로 시작하고, 그 뒤로는 모두 소문자로 이루어진 문자열"**을 의미하며, 문자열 전체가 이 형식을 따라야 합니다. 예를 들어, `Alice`, `Bob`과 같은 형식은 이 조건을 만족하지만, `ALICE`, `alice`, `AlIce`는 조건을 만족하지 않습니다.

728x90
반응형