본문 바로가기
Data Analysis/SQL

5. SQL 날짜와 시간, 문자열 다루기, REGEXP(Regular Expression(정규 표현식)), SQL 공부전 처음에 무조건 읽어야 하는 글 !

by Hagrid 2022. 11. 15.
반응형

날짜와 시간

날짜와 시간은 date 와 string 을 왔다갔다 하므로 잘 비교해줘야 한다.

날짜를 문자형 형태로 비교하기 위해서는 date 타입을 string으로 변환

TO_CHAR() 함수를 이용

WHERE '20220115' > TO_CHAR(date, 'YYYY') as Year -> 2022
WHERE '20220115' > TO_CHAR(date, 'mm') as month -> 01
WHERE '20220115' > TO_CHAR(date, 'YYYY') as day -> 15

string 형태를 date 형태로 비교하고 싶은 경우

TO_DATE() 함수를 이용

WHERE SYSDATE > TO_DATE('20220115', 'YYYY-MM-DD') -> 2022-01-15
함수 내용
DATE_FORMAT(날짜, 'FORMAT') 날짜를 해당 포멧으로 변환
DATE(날짜) 날짜를 '연도-월-일'로 변환
YEAR(날짜) 날짜의 연도 반환
MONTH(날짜) 날짜의 월 반환
   

날짜와 문자열

데이터베이스를 사용하다면 날짜를 문자열로 또는 문자를 날짜로 바꿀 때가 있다

오라클에서 사용하는 함수

숫자 또는 날짜 데이터 → 문자형

TO_CHAR(데이터, '출력 형식')

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD')  
--  오늘 날짜의 출력 형식을 결정해서 문자로 리턴
SELECT TO_CHAR(100000, '00000000')

다음은 문자→ 날짜형으로 변환

TO_DATE(데이터, '날짜 형식')

SELECT TO_DATE('20080101', 'YYYY/MM/DD')  
--  20080101이라는 문자를 2008/01/01의 형태의 날짜로 리턴

MYSQL에서 사용하는 함수

날짜→ 문자열

DATE FORMAT(날짜, 출력 형식)을 사용한다

SELECT DATE_FORMAT('2019-09-16 20:23:12', '%Y/%M/%D')  
--  2019/09/16 출력

문자열을 날짜로 변환할 때는

STR_TO_DATE(문자, 출력 형식)

SELECT STR_TO_DATE('20080101', '%Y-%M-%D')  
--  20080101이라는 문자를 2008-01-01의 형태의 날짜로 리턴

MSSQL

날짜→ 문자

CONVERT(포맷(길이), 날짜, 변환 형식)

SELECT CONVERT(VARCHAR, GETDATE(), 120)  
--  결과 : 2019-09-15 15:30:11

120은 YYYY-MM-DD HH24:MI:SS 형식이다

문자 → 날짜

CONVERT(날짜 형식, 문자)

SELECT CONVERT(DATE, '2008-01-01')  
--  2008-01-01 문자가 날짜로 변경된다
SELECT CONVERT(DATETIME, '2008-01-01 15:14:13')  
--  2008-01-01 15:14:13 문자가 날짜/시간으로 변경된다

1. 정규 표현식 이란?

  • 특정한 조건의 문자검색하거나 치환하는 과정을 매우 간편하게 처리할 수 있도록 해주는 수단
    • 해당 Pattern과 일치하는 문자열을 검색하는 것
    • = 대상 문자열에 정규표현식을 적용해서 찾을 문자열을 검색해내는 것

RegexOne - Learn Regular Expressions - Lesson 7: Mr. Kleene, Mr. Kleene

  • 튜토리얼하면서 REGEXP 익히기 가능

2. 패턴의 종류

Matching

Pattern 기능 예시 설명
. 문자 하나 "..." 문자열의 길이가 세 글자 이상인 것을 찾음.
I(수직선) 또는 (OR). I(수직선)로 구분된 문자에 해당하는 문자열을 찾음. "데이터I(수직선)데이타" ‘데이터’ 또는 ‘데이타’에 해당하는 문자열을 찾음.
[] [] 안에 나열된 패턴에 해당하는 문자열을 찾음. "[123]d" 대상 문자열에서 ‘1d’ 또는 ‘2d’ 또는 ‘3d’인 문자열을 찾음.
^ 시작하는 문자열을 찾음. "^안녕" 대상 문자열에서 ‘안녕’으로 시작하는 문자열을 찾음.
$ 끝나는 문자열을 찾음. "잘가$" 대상 문자열에서 ‘잘가’로 끝나는 문자열을 찾음.

Numbers Limit

Pattern 기능 예시 설명
* 0회 이상 나타나는 문자 "a*" ‘a’가 0번 이상 등장하는 문자열을 찾음. ‘b’, ‘a’, ‘aa’ 모두 해당.
+ 1회 이상 나타나는 문자 "국+" ‘국’이 1번 이상 등장하는 문자열을 찾음. ‘한국’, ‘미역국’, ‘국거리’ 모두 해당.
{m,n} m회 이상 n회 이하 반복되는 문자 "치{1,2}" ‘치’가 1회 이상 2회 이하 반복하는 문자열을 찾음. ‘치커리’, ‘치카치카’ 모두 해당.
? 0~1회 나타나는 문자 "[가나다]?" ‘가’ 또는 ‘나’ 또는 ‘다’가 0~1회 등장하는 문자열을 찾음. ‘가지마’, ‘나라’, ‘안녕’ 모두 해당.

char

패턴 기능 사용 예시 설명
[A-z] 또는 [:alpha:] 또는 \a 알파벳 대문자 또는 소문자인 문자열을 찾음 "[A-z]+" 대상 문자열에서 알파벳이 한 개 이상인 문자열을 찾음
[0-9] 또는 [:digit:] 또는 \d 숫자인 문자열을 찾음 "^[0-9]+" 한 개 이상의 숫자로 시작하는 문자열을 찾음

Not

Pattern 기능 예시 설명
[^문자] 괄호 안의 문자를 포함하지 않은 문자열을 찾음 "[^길로그]" ‘길’ 또는 ‘로’ 또는 ‘그’를 포함하지 않는 문자열을 찾음. ‘길가’, ‘로그’, ‘그리고’ 모두 제외됨.
-- vowel 로 시작하지 않는 것들 검색하기 

SELECT DISTINCT CITY 
FROM STATION 
WHERE CITY RLIKE '^[^aeiouAEIOU].*';

3. 예시

--  '설' 또는 '유"가 포함된 문자열을 찾고 싶을 때

--  정규표현식을 사용하지 않을 때

SELECT *
FROM tbl -- table
WHERE data like '%설%'
OR data like '%유%'
;

--  정규표현식을 사용할 때

SELECT *
FROM tbl
WHERE data REGEXP '설|유'  -- 엔터키 위에 '|' 
;
# 길이 7글자인 문자열 중 2번째 자리부터 '설'를 포함하는 문자열을 찾고 싶을 때

# 정규표현식을 사용하지 않을 때
SELECT *
FROM tbl
WHERE CHAR_LENGTH(data) = 7 
    AND SUBSTRING(data, 2, 3) = '설';

-- CHAR_LENGTH = 문자열의 길이 check  
-- => 숫자로 return

# 정규표현식을 사용할 때
SELECT *
FROM tbl
WHERE data REGEXP ('^.설...$');

-- . 온점을 가지고 자릿수를 만들었다.
# 텍스트와 숫자가 섞여 있는 문자열에서 **숫자로만 이루어진 문자열**을 찾고 싶을 때

# 정규표현식을 사용하지 않을 때
SELECT *
FROM tbl
WHERE data LIKE ??????????

-- >??? 

# 정규표현식을 사용할 때
SELECT *
FROM tbl
WHERE data REGEXP ('^[0-9]+$'); 
-- OR data REGEXP ('^\d$') 
-- OR data REGEXP ('^[:digit:]$');

-- $ -> 끝나는 문자열을 찾기
-- [0-9]+ -> 숫자인 문자열 

4. python

  • Python에서는 re라는 모듈로 정규식 활용

정규식 원리 시각화 사이트

https://regexper.com/#SELECT DISTINCT CITY FROM STATION
WHERE CITY RLIKE '^[^aeiouAEIOU].*'%3B


참고

https://velog.io/@gillog/MySQL-REGEXPRegular-Expression정규-표현식

https://yurimkoo.github.io/analytics/2019/10/26/regular_expression.html


SQL 관련 글들

  • 데이터 분석을 준비하기전 제일 먼저 읽었던 글들이다. 사실 그때는 파이썬 하나면 모든 부분이 해결 가능할줄 알았다.
  • SQL에 대한 중요성을 몰랐다. 위 글들을 읽고 실제로 분석가가 업무에 어떻게 SQL을 사용하는지 이해하고 나서야 SQL에 대한 중요성을 알게되었다.
  • 이것이 사실 나에게는 큰 행운이라고 생각한다. 데이터 분석 직무 준비에 있어 시간낭비를 많이 안하게 되었으니까 ?
  • 앞으로 관련해서 더 좋은 글들이 있으면 추가할 예정이다 !
반응형

댓글