SQL 정규표현식

robin·2021년 9월 11일
0

SQL 공부

목록 보기
6/6
post-thumbnail

정규표현식

  • 정규표현식은 검색할 패턴을 명시하는 방법임.
형태설명
REGEXP 매치할 정규표현식이 뒤따름.
NOT REGEXP REGEXP의 부정.

출처: https://dev.mysql.com/doc/refman/8.0/en/regexp.html

<예제>
[문제]
Query the list of CITY names starting with vowels (i.e., a, e, i, o, or u) from STATION. Your result cannot contain duplicates.

[풀이1]

SELECT DISTINCT city
FROM station
WHERE city REGEXP '^[aeiou].*'
- ^: 문자열의 시작을 매칭함.
- []: 집합에 있는 어떤 문자와 매칭함. 
- .: 어떤 문자와 매칭함. 
- *: 이전 토큰의 0개 이상에 매칭함. 

=> 'aeiou' 중 어떤 문자로든 시작하고 이후에 어떤 문자가 0개 이상 등장하는 도시 이름을 중복 없이 선택함.

[풀이2]

SELECT DISTINCT city
FROM station
WHERE city REGEXP '^[aeiou]'

=> 'aeiou' 중 어떤 문자로든 시작하는 도시 이름을 중복 없이 선택함.

  • 참고: SQL은 대소문자에 민감하지 않기 때문에 [AEIOUaeiou]로 표현하지 않아도 되지만 다른 프로그래밍 언어(예: 파이썬)에서는 대소문자 구분함.

출처: https://www.hackerrank.com/challenges/weather-observation-station-6/problem?h_r=internal-search

<예제>
[문제]
Query the list of CITY names from STATION that do not start with vowels and do not end with vowels. Your result cannot contain duplicates.

[풀이]

SELECT DISTINCT city
FROM station
WHERE city NOT REGEXP '(^[aeiou]|[aeiou]$)'
- $: 문자열의 끝에 매칭함.
- (조건1|조건2): 조건1 혹은 조건2에 매칭함. 

=> 도시 이름 중에서 'aeiou'중 어떤 문자로 시작하거나 'aeiou'중 어떤 문자로 끝나는 이름 패턴과 같지 않은 도시 이름을 중복없이 선택함.

출처: https://www.hackerrank.com/challenges/weather-observation-station-12/problem?h_r=internal-search

<예제> 프로그래머스 - SQL 고득점 Kit - JOIN - 보호소에서 중성화한 동물

[문제]

  • ANIMAL_INS 테이블
    ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

    NAMETYPENULLABLE
    ANIMAL_IDVARCHAR(N)FALSE
    ANIMAL_TYPEVARCHAR(N)FALSE
    DATETIMEDATETIMEFALSE
    INTAKE_CONDITIONVARCHAR(N)FALSE
    NAMEVARCHAR(N)TRUE
    SEX_UPON_INTAKEVARCHAR(N)FALSE
  • ANIMAL_OUTS 테이블
    ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

    NAMETYPENULLABLE
    ANIMAL_IDVARCHAR(N)FALSE
    ANIMAL_TYPEVARCHAR(N)FALSE
    DATETIMEDATETIMEFALSE
    NAMEVARCHAR(N)TRUE
    SEX_UPON_OUTCOMEVARCHAR(N)FALSE

보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요. 중성화를 거치지 않은 동물은 성별 및 중성화 여부에 Intact, 중성화를 거친 동물은 Spayed 또는 Neutered라고 표시되어있습니다.

[풀이]

SELECT i.animal_id, i.animal_type, i.name
FROM animal_ins AS i
INNER JOIN animal_outs AS o ON i.animal_id = o.animal_id
WHERE i.sex_upon_intake REGEXP '^Intact' AND o.sex_upon_outcome REGEXP '^(Spayed|Neutered)'
ORDER BY i.animal_id

=> 보호소에 들어올 때에 성별 및 중성화 여부는 Intact로 시작하고, 보호소에서 나갈 때 성별 및 중성화 여부는 Spayed 혹은 Neutered로 시작하는 동물의 아이디, 종, 이름을 선택함.

출처: https://programmers.co.kr/learn/challenges

profile
데이터 분석을 공부하는 🌱

0개의 댓글