조건문 : 만약 특정 조건이 충족되면 -> 어떤 행동을 하도록 만드는 구문이다
조건문 함수 :
예시) 학년 별(1, 2, 3, 4, 5, 6) 성적에 대해
-> 저학년(1, 2, 3) / 고학년(4, 5, 6) 별 성적 평균 차이를 알고 싶은 경우
=> 저학년 / 고학년으로 카테고리화
요일 별(월, 화, 수, 목, 금, 토, 일) 택시 수요에 대해
-> 주중(월~금) / 주말(토, 일) 별 수요 패턴의 차이를 알고 싶은 경우
=> 주중 / 주말로 카테고리화
-> 보통 데이터를 저장하는 팀(데이터 엔지니어링) 과 데이터를 분석하는 팀으로 나뉘는데,
-> 저장할 때부터 특정 카테고리를 합쳐서 저장하면, 분석할 때 쪼개서 보는 것이 번거로워진다
=> 저장할 땐 카테고리를 나눠서 저장하고,
=> 분석할 때 필요한 부분에서 조건 설정하여 특정 카테고리를 하나로 합치는 것이 더 유용하다
문법)
SELECT CASE WHEN 조건1 THEN 조건1이 참일 경우의 결과 WHEN 조건2 THEN 조건2가 참일 경우의 결과 ELSE 그 외 조건일 경우의 결과 END AS 새로운_컬럼_이름 FROM
예시) 각 포켓몬의 공격력(attack)을 기준으로 50 이상이면 'Strong', 100 이상이면 'Very Strong', 그 이하면 'Weak'으로 분류해주세요
1. SELECT eng_name, attack, CASE WHEN attack >= 100 THEN 'Very Strong' WHEN attack >= 50 THEN 'Strong' ELSE 'Weak' END AS attack_level FROM basic.pokemon ORDER BY attack DESC
2. SELECT eng_name, attack, CASE WHEN attack >= 50 THEN 'Strong' WHEN attack >= 100 THEN 'Very Strong' ELSE 'Weak' END AS attack_level FROM basic.pokemon ORDER BY attack DESC
=> 조건문의 순서만 바뀐건데, 다른 결과가 나왔다
문법)
IF(조건문, True일 때의 결과, False일 때의 결과) AS 새로운_컬럼_이름
-- 쿼리를 작성하는 목표, 확인할 지표 : speed 컬럼을 사용해 새로운 Speed_Category 생성 -- 쿼리 계산 방법 : case when, if => 조건이 단일이다. if. 70 이상 -- 데이터의 기간 : X -- 사용할 테이블 : pokemon -- Join KEY : X -- 데이터 특징 : speed의 min, max 확인 -- min, max 확인) SELECT min(speed) as min_speed, max(speed) as max_speed FROM basic.pokemon
문제 풀이) SELECT id, kor_name, speed, IF(speed >=70, "빠름", "느림") AS Speed_Category FROM basic.pokemon
-- 쿼리를 작성하는 목표, 확인할 지표 : type1을 사용해서 새로운 컬럼 생성 -- 쿼리 계산 방법 : case when, if => 여러 조건이 있음 => case when -- 데이터의 기간 : X -- 사용할 테이블 : pokemon -- Join KEY : X -- 데이터 특징 : 타입이 두가지가(type1, type2) 있다. 그러나 type1만 활용하는 문제 -- 문제풀이) SELECT id, kor_name, type1, CASE WHEN type1 = "Water" then "물" WHEN type1 = "Fire" then "불" WHEN type1 = "Electric" then "전기" ELSE "기타" END AS type1_Korean FROM basic.pokemon
# 쿼리를 작성하는 목표, 확인할 지표 : total 컬럼 => 조건에 맞는 값을 변경! 모두 다 숫자! # 쿼리 계산 방법 : case when # 데이터의 기간 : # 사용할 테이블 : pokemon # Join KEY : # 데이터 특징 : total 컬럼이 정수(INTEGER) -- 문제풀이) SELECT id, kor_name, total, CASE WHEN total >= 501 then "High" WHEN total between 301 and 500 then "Medium" ELSE "Low" END AS total_grade FROM basic.pokemon (-- WHERE -- total_grade = "Low")결과가 잘 나왔는지 확인하기 위해 WHERE절에 total_grade를 넣으면 => 오류 => WHERE절은 SELECT절 전에 수행되기 때문 => 서브쿼리로 해결
SELECT * FROM ( SELECT id, kor_name, total, CASE WHEN total >= 501 then "High" WHEN total between 301 and 500 then "Medium" ELSE "Low" END AS total_grade FROM basic.pokemon ) WHERE total_grade = "Low"
# 쿼리를 작성하는 목표, 확인할 지표 : badge_count => 조건에 만족하는 값을 변경 # 쿼리 계산 방법 : case when # 데이터의 기간 : x # 사용할 테이블 : trainer # Join KEY : x # 데이터 특징 : x -- 문제풀이) SELECT trainer_level, count(distinct id) as trainer_cnt FROM ( SELECT id, name, badge_count, CASE WHEN badge_count>=9 then "Advanced" WHEN badge_count BETWEEN 6 AND 8 then "Intermediate" ELSE "Beginner" END AS trainer_level FROM basic.trainer ) GROUP BY trainer_level
-> 아직 Advanced 단계는 없다!
# 쿼리를 작성하는 목표, 확인할 지표 : 포획한 날짜 기준으로 값을 변경 # 쿼리 계산 방법 : if # 데이터의 기간 : X # 사용할 테이블 : trainer_pokemon # Join KEY : X # 데이터 특징 : catch_date는 UTC 기준. catch_datetime은 TIMESTAMP -- 문제풀이) SELECT recent_or_old, count(id) as cnt FROM( SELECT id, trainer_id, pokemon_id, catch_datetime, IF(DATE(catch_datetime, "Asia/Seoul") > "2023-01-01", "Recent", "Old") as recent_or_old FROM basic.trainer_pokemon ) GROUP BY recent_or_old
-> 이처럼 모든 조건이 Recent로 반환된다면,
-> SELECT절에 "Recent" as recent_value를 작성하여
-> 모든 컬럼에 동일한 값을 줘도 된다
# 쿼리를 작성하는 목표, 확인할 지표 : 승패 여부를 알 수 있는 컬럼을 만들고 싶다! # 쿼리 계산 방법 : case when # 데이터의 기간 : X # 사용할 테이블 : battle # Join KEY : X # 데이터 특징 : X -- 문제풀이) SELECT id, winner_id, player1_id, player2_id, CASE WHEN winner_id = player1_id then "Player 1 Wins" WHEN winner_id = player2_id then "Player 2 Wins" ELSE "Draw" END AS battle_result FROM basic.battle