목표: SQL에서 if 문처럼 조건이 있는 경우를 구현하고자 한다.
보통 코딩을 배우다보면, 자신이 원하는 일정 조건에 대해서 구현하고자 할 때 사용하는 조건문을 반드시 배우고 실제로도 많이 사용하는 부분이기도 하다. 내가 배웠던 다른 언어들에서는 if로 보통 구현이 되는데, SQL은 조금 다르게 구현이 된다.
여기서 살펴볼 것은 2가지이다. 첫번째는 가장 많이 알고 있을 CASE WHEN을 이용하는 것이고, 두번째는 INNER JOIN을 self로 해서 ON을 활용하는 방법이다. 각각에 대해서 서로 다른 케이스로 살펴봤다.
1. CASE WHEN
- 형태: CASE WHEN (조건) THEN (결과) ~ ELSE (결과) END
- 가장 많이 볼 수 있는 if문과 거의 차이가 없다. 그래서 처음 SQL을 하더라도 기존 코딩을 배웠다면, 쉽게 접근할 수 있는 방법
- 상황: countries란 테이블에서 surface_area의 기준에 따라 분류한다. 그리고 이 분류한 값들을 geosize_group으로 저장한다.
SELECT name, continent, code, surface_area,
CASE WHEN surface_area > 2000000 THEN 'large'
WHEN surface_area > 350000 THEN 'medium'
ELSE 'small' END
AS geosize_group
FROM countries;
다음은 INNER JOIN으로 self-JOIN시켜서 ON으로 조건을 찾는 방법이다.
2. ON
- 형태: INNER JOIN (테이블) ON (조건)
- 이렇게 나누는 방법은 SQL에서 처음 보는 것 같다. 그래서 기존에 코딩을 배웠어도 이해하는데 시간이 필요할 수도 있는 방법이다.
- 상황: populations란 테이블에서 p1과 p2 테이블로 가져와서 INNER JOIN시키고 country_code가 일치하고, 2010년과 2015년 데이터를 가져와서 그 사이의 성장률(growth_perc)를 찾아야 한다.
SELECT p1.country_code,
p1.size AS size2010,
p2.size AS size2015,
-- calculate growth_perc
((p2.size - p1.size)/p1.size * 100.0) AS growth_perc
FROM populations AS p1
-- Join to itself (alias as p2)
INNER JOIN populations AS p2
-- Match on country code
ON p1.country_code = p2.country_code
-- Match on year (with calculation)
AND p1.year = p2.year - 5;
두 가지를 모두 살펴봤을 때 모두 조건을 활용하고자 하면 사용이 가능하겠지만, 각각의 방법이 더 적합할 때는 따로 있는 것 같다. 첫번째 살펴봤던 CASE WHEN은 기존에 있던 테이블에 필드를 추가해서 살펴볼 때 사용하는 것이 가능하다. 즉, 데이터 분석을 위한 사전작업을 하기 위해서 조금 더 적합해 보인다.
반면, 두번째인 ON을 활용하는 것은 키값(여기서는 country_code)을 중심으로 조건을 적용한 테이블을 생성하게 된다. 엑셀로 치자면 피벗테이블을 만드는 느낌?인데 내가 뭘 분석해야 할지 안다는 가정하에서 이 방법은 훨씬 빠르게 결론에 도달할 수 있을 것처럼 보인다.
'SQL' 카테고리의 다른 글
SQL로 이동평균(MA; Moving Average) 구하기 (0) | 2020.08.17 |
---|---|
SQL 랭킹 매기기_올림픽 메달 획득 순위 구하기 (0) | 2020.08.17 |
백분율을 계산하는 다른 방법_ AVERAGE 이용하기 (1) | 2020.08.11 |
SQL_INNER, LEFT, FULL JOIN의 비교_나라별 code에 맞춰 테이블 JOIN하기 (1) | 2020.08.08 |
SQL_WHERE 대신 HAVING을 사용해야만 할 때 (0) | 2020.07.30 |