오늘 학습 키워드
case when 조건문
오늘 학습 한 내용을 나만의 언어로 정리하기
새로운 한 주가 시작된 날이다. 기존에 학습하던 강의 내용을 졸업하고 새롭게 강의를 받게 되었다. SQL의 기본을 다시 되짚어보고 case when 조건문을 적용하는 과제를 수행했다. 과제를 풀면서 내가 이해했던 내용들을 적용해나가는 게 아주 즐겁고 흥미로웠다.
더하여 "데이터 리터러시"에 대해서도 학습했다. 요점은 단순 분석에 그치지 말 것. 분석을 지나 왜 일어난 현상인지, 앞으로 어떻게 할 것인지를 잘 생각해야 한다는 것이 포인트였다.
학습 내용
과제의 문제는 총 3개였다. 1번 문제는 where 구문의 기초적인 활용에 대해서 실습했다. 2번 문제는 여기서 나아가 where 구문을 응용하는 것을 실습했고, 마지막 3번 문제에서 대망의 case when 조건문을 활용한 query문을 작성하였다.
학습 주제: SQL의 기초 내용 실습
핵심 개념 정리: case when 조건문은 다양한 조건을 추가해 원하는 결과값을 얻는 구조이다. 이를 활용할 시, 보다 깔끔한 SQL문을 작성할 수 있게 된다.
코드 예시 + 결과:
실습 문제로 확인해보자. 우선 실습 문제 1번이다.
1번 문제의 조건은
first_login_date 컬럼이 2023-01-01을 초과하는 game_account_id, game_actor_id, serverno 3개의 컬럼을 추출하는 것
이었다. 해당 컬럼의 데이터를 가진 테이블은 basic.users 이다. 여기에 실제로 최초 로그인 날짜가 2023년 1월 1일을 넘는지 확인하기 위해서 first_login_date 컬럼을 select문에 추가하고, 해당 날짜를 오름차순으로 정렬하는 형태로 코드를 작성하면 다음과 같이 코드가 형성된다.
select first_login_date, game_account_id, game_actor_id, serverno
from basic.users
where first_login_date>'2023-01-01'
order by first_login_date asc
;
이 코드를 실행할 경우 얻게 되는 데이터값은 다음과 같다.

사진을 통해 원하던 조건대로 데이터값이 출력된 것을 확인할 수 있다.
2번 문제는 다음과 같다.
아래 조건을 모두 만족하는 데이터의 first_login_date, ip_addr, exp, zone_id 를 추출하고 first_login_date을 기준으로 내림차순으로 정렬해주세요.
조건1) level 컬럼이 10 초과이고
조건2) serverno컬럼이 1이 아니며
조건3) 아이템 이름 컬럼이 레벨업 패키지 또는 시즌패스이고
조건4) 아이템 획득 경로가 상점에서 구매한 경우
2번 문제의 조건을 query로 작성하면 다음과 같다.
select first_login_date,ip_addr, exp, zone_id
from basic.users
where (level>10)
and (serverno!=1)
and (etc_str2 in ('레벨업 패키지', '시즌패스'))
and (etc_str1='상점에서 구매')
order by first_login_date desc
;
결과는 다음과 같이 출력된다.

마찬가지로 원하던 결과값이 나왔다.
마지막 3번 문제의 조건은 다음과 같다. 이번에는 조건이 조금 길다.
아래 조건을 만족하는 데이터의 game_actor_id, level, levelgroup, first_login_date 컬럼을 추출해주시고, first_login_date를 기준으로 내림차순 정렬해주세요.
조건1) case when 구문을 사용하여 레벨구간을 아래와 같이 구분해주시고, 컬럼이름을 ‘levelgroup’ 으로 설정해주세요.
[레벨구간]
◦ 1~10Lv 이하
◦ 11~20Lv 이하
◦ 21~30Lv 이하
◦ 31~40Lv 이하
◦ 41~50Lv 이하
◦ 51~60Lv 이하
◦ 61~70Lv 이하
◦ 71~80Lv 이하
◦ 81~90Lv 이하
◦ 91~100Lv
위의 조건을 모두 만족하는 query문을 작성한다면,
select game_actor_id, level,
case when level between 1 and 10 then '1~10Lv 이하'
when level between 11 and 20 then '11~20Lv 이하'
when level between 21 and 30 then '21~30Lv 이하'
when level between 31 and 40 then '31~40Lv 이하'
when level between 41 and 50 then '41~50Lv 이하'
when level between 51 and 60 then '51~60Lv 이하'
when level between 61 and 70 then '61~70Lv 이하'
when level between 71 and 80 then '71~80Lv 이하'
when level between 81 and 90 then '81~90Lv 이하'
else '91~100Lv' end 'levelgroup',
first_login_date
from basic.users
order by first_login_date desc
;
위와 같은 코드를 작성할 수 있다. 그런데 여기서 조금 더 단순하게 코드를 바꿔줄 수 있다. case when의 경우 첫 번째 when을 먼저 계산하고 남은 데이터로 다음 계산을 이어가게 된다. 이를 이용하여 첫 번째 when에서 between을 제거하고 level<=10 then '1~10Lv 이하'의 형식으로 바꿔준다. 이후, 아래 when을 같은 형식으로 교체해주면 끝이다.
select game_actor_id, level,
case when level<=10 then '1~10Lv 이하'
when level<=20 then '11~20Lv 이하'
when level<=30 then '21~30Lv 이하'
when level<=40 then '31~40Lv 이하'
when level<=50 then '41~50Lv 이하'
when level<=60 then '51~60Lv 이하'
when level<=70 then '61~70Lv 이하'
when level<=80 then '71~80Lv 이하'
when level<=90 then '81~90Lv 이하'
else '91~100Lv' end as 'levelgroup',
first_login_date
from basic.users
order by first_login_date desc
;
위 두 코드 모두 같은 값을 출력하게 된다. 둘 중에 손에 더 익은 것이든, 혹은 경제적인 것을 골라서 작성하면 될 것이다.
이 코드들을 실행해보면

위와 같은 값을 출력한 것을 볼 수 있다.
ps. 날이 갑작스레 쌀쌀해졌다. 가을이 왔다고 좋아하던 시간이 고작 일주일 정도밖에 되지 않는다... 가을이 지나고 벌써 초겨울이라고 생각해도 무방할 것이다. 모두들 건강에 유의하시길 바라며...
이만 총총.
#내일배움캠프 #본캠프 # 10기 #TIL