1. https://www.hackerrank.com/challenges/weather-observation-station-7/problem?isFullScreen=true
Q: Query the list of CITY names ending with vowels (a, e, i, o, u) from STATION. Your result cannot contain duplicates.
Input Format
The STATION table is described as follows:
A:
SELECT DISTINCT city
FROM station
WHERE city LIKE '%a'
OR city LIKE '%e'
OR city LIKE '%i'
OR city LIKE '%o'
OR city LIKE '%u'
Q: Query the list of CITY names from STATION which have vowels (i.e., a, e, i, o, and u) as both their first and last characters.
Your result cannot contain duplicates.
Input Format
The STATION table is described as follows:
A:
SELECT DISTINCT city
FROM station
WHERE city LIKE 'a%a'
OR city LIKE 'a%e'
OR city LIKE 'a%i'
OR city LIKE 'a%o'
OR city LIKE 'a%u'
OR city LIKE 'e%a'
OR city LIKE 'e%e'
OR city LIKE 'e%i'
OR city LIKE 'e%o'
OR city LIKE 'e%u'
OR city LIKE 'i%a'
OR city LIKE 'i%e'
OR city LIKE 'i%i'
OR city LIKE 'i%o'
OR city LIKE 'i%u'
OR city LIKE 'o%a'
OR city LIKE 'o%e'
OR city LIKE 'o%i'
OR city LIKE 'o%o'
OR city LIKE 'o%u'
OR city LIKE 'u%a'
OR city LIKE 'u%e'
OR city LIKE 'u%i'
OR city LIKE 'u%o'
OR city LIKE 'u%u'
- 이렇게 해도 답은 맞지만, SQL에서는 LIKE와 IN을 함께 사용할 수 없어서 위처럼 LIKE를 계속 병렬 연결해야 한다.
- 이처럼 쿼리가 지저분해지는 것을 막기 위해 MySQL 정규표현식을 활용하여 데이터를 검색해보자
- 정규표현식 Regular Expression이란?
- 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어
- REGEXP를 사용하면 기본 연산자보다 복잡한 문자열 조건을 걸어 데이터를 검색할 수 있다
- 사용되는 패턴 종류
- 매칭 Matching
Pattern | 기능 | 예시 | 설명 |
. | 문자 한개 | '...' | 문자열 길이가 세 글자 이상인 것을 찾음 |
| | 또는 OR, |로 구분된 문자에 해당하는 문자열을 찾음 | 'a | c' | 'a' 또는 'c'에 해당하는 문자열을 찾음 |
[ ] | [ ]안에 나열된 패턴에 해당하는 문자열을 찾음 | '[123]d' | 대상 문자열에서 '1d' 또는 '2d' 또는 '3d'인 문자열을 찾음 |
^ | 시작하는 문자열을 찾음 | '^ab' | 대상 문자열에서 'ab'로 시작하는 문자열을 찾음 |
$ | 끝나는 문자열을 찾음 | 'ab$' | 대상 문자열에서 'ab'로 끝나는 문자열을 찾음 |
- 횟수 제한 Number Limit
Pattern | 기능 | 예시 | 설명 |
* | 0회 이상 나타나는 문자 | 'a*' | 'a'가 0번 이상 등장하는 문자열 찾음 ex) 'b', 'aa', 'a', ... |
+ | 1회 이상 나타나는 문자 | '국+' | '국'이 1번 이상 등장하는 문자열을 찾음 ex) '미역국', '국거리', ... |
{m,n} | m회 이상 n회 이하 반복되는 문자 | '치{1,2}' | '치'가 1회 이상 2회 이하 반복되는 문자열 찾음 ex) '치약', '치카치카', ... |
? | 0~1회 나타나는 문자 | '[가나다]?' | '가' 또는 '나' 또는 '다'가 0~1회 등장하는 문자열을 찾음 ex) '나라', '잘가', '안녕', ... |
- 그룹 형태 Group
Pattern | 기능 | 예시 | 설명 |
[A-z] 또는 [:alpha:] 또는 \a | 알파벳 대문자 또는 소문자인 문자열을 찾음 | '[A-z]+' | 대상 문자열에서 알파벳이 한 개 이상인 문자열을 찾음 |
[0-9] 또는 [:digit:] 또는 \d | 숫자인 문자열을 찾음 | '^[0-9]+' | 한 개 이상의 숫자로 시작하는 문자열을 찾음 |
[^문자] | 괄호 안의 문자를 포함하지 않는 문자열을 찾음 | '[^부정]' | '부' 또는 '정'을 포함하지 않는 문자열을 찾음 ex) '부자', '정말' 등 제외됨 |
- REGEXP
Q1: table1이라는 테이블에서 col1 칼럼 중 '안녕' 또는 '하이'로 시작하는 문자열을 찾아라
A1:
SELECT *
FROM table1
WHERE data REGEXP ('^안녕' | '^하이')
Q2: table1이라는 테이블에서 길이 7글자인 문자열 중 2번째 자리부터 abc를 포함하는 문자열을 찾아라
A2:
SELECT *
FROM table1
WHERE data REGEXP ('^.abc...$')
- 한 글자로 시작하고 2번째 자리부터는 a b c, 세 글자 남기고 끝난다는 것
Q3: table1이라는 테이블에서 텍스트와 숫자가 섞여 있는 문자열에서 숫자로만 이루어진 문자열을 찾아라
A3:
SELECT *
FROM table1
WHERE data REGEXP ('^[0-9]+$')
-- or data REGEXP ('^\d$')
-- or data REGEXP ('^[:digit:]$')
- 정규표현식 패턴을 실제 적용하기 전 테스트할 수 있는 사이트: https://regexr.com/
- 그래서 위의 해커랭크 문제를 다시 풀어보자
A:
SELECT city
FROM station
WHERE city REGEXP '^[aeiou]'
AND city REGEXP '[aeiou]$'
*참고 : https://yurimkoo.github.io/analytics/2019/10/26/regular_expression.html
https://www.w3schools.com/sql/sql_wildcards.asp
'SQL' 카테고리의 다른 글
HackerRank 해커랭크 SQL(Basic) 뽀개기 (1) + LENGTH() (0) | 2024.03.23 |
---|---|
Aggregate Function 집계 함수 - COUNT/SUM/AVG/MIN/MAX (0) | 2023.07.07 |
ORDER BY/LEFT/RIGHT/SUBSTR/CEIL/FLOOR/ROUND + 해커랭크 예제 풀이 (0) | 2023.06.26 |
HackerRank 해커랭크 SQL 예제 추가 풀이 (1) (0) | 2023.06.23 |
WHERE문 해커랭크 예제 풀이(DISTINCT, NOT LIKE) (0) | 2023.06.22 |