SQL에서 일정 조건을 만족하는 필드 가져오기 (CASE WHEN과 self join해서 ON 이용하기)
목표: SQL에서 if 문처럼 조건이 있는 경우를 구현하고자 한다. 보통 코딩을 배우다보면, 자신이 원하는 일정 조건에 대해서 구현하고자 할 때 사용하는 조건문을 반드시 배우고 실제로도 많이 사용하는 부분이기도 하다. 내가 배웠던 다른 언어들에서는 if로 보통 구현이 되는데, SQL은 조금 다르게 구현이 된다. 여기서 살펴볼 것은 2가지이다. 첫번째는 가장 많이 알고 있을 CASE WHEN을 이용하는 것이고, 두번째는 INNER JOIN을 self로 해서 ON을 활용하는 방법이다. 각각에 대해서 서로 다른 케이스로 살펴봤다. 1. CASE WHEN - 형태: CASE WHEN (조건) THEN (결과) ~ ELSE (결과) END - 가장 많이 볼 수 있는 if문과 거의 차이가 없다. 그래서 처음 SQL..
2020.08.03
SQL
SQL_WHERE 대신 HAVING을 사용해야만 할 때
최근에 SQL에 대해 입문과정을 조금 거쳤다. SQL은 내가 회사를 다니면서 필요한 데이터에 접근하는데 필요했지만, 사실 그렇게 내가 직접 접근하려는 시도보다는 담당자에게 연락해서 따로 받는 경우가 많았다. 그러다보니, 업무에 있어서 담당자가 없거나 일이 밀려 있으면 내 일도 진척되지 않는 경우도 허다했고, 진짜 raw data에 접근하는 건 아니다보니 인사이트를 얻는데도 한계가 있었던 것 같다. 이런 경험으로 SQL에 대해 조금 공부할 필요를 느꼈고, 최근에 입문은 한번 봤다고 할 수준에는 도달한 것 같다. 하지만, 인간은 망각의 동물이라고 했던가. 지금 열심히 해놓은 것도 아마 6개월정도가 지나면 다 까먹을 것이다. 그래서 배운 나를 위해서라도 기록이 필요하다. 다행스러운 점은 SQL이 굉장히 사람이..
2020.07.30
SQL
반응형

목표: 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은 내가 회사를 다니면서 필요한 데이터에 접근하는데 필요했지만, 사실 그렇게 내가 직접 접근하려는 시도보다는 담당자에게 연락해서 따로 받는 경우가 많았다. 그러다보니, 업무에 있어서 

담당자가 없거나 일이 밀려 있으면 내 일도 진척되지 않는 경우도 허다했고, 진짜 raw data에 접근하는 건 아니다보니 인사이트를 얻는데도 한계가 있었던 것 같다. 이런 경험으로 SQL에 대해 조금 공부할 필요를 느꼈고, 최근에 입문은 한번 봤다고 할 수준에는 도달한 것 같다.

 

하지만, 인간은 망각의 동물이라고 했던가. 지금 열심히 해놓은 것도 아마 6개월정도가 지나면 다 까먹을 것이다. 그래서 배운 나를 위해서라도 기록이 필요하다. 다행스러운 점은 SQL이 굉장히 사람이 쓰는 언어와 유사하고, 배우는데 크게 허들이 존재하지 않는 언어인 것 같다는 점이다.

 

기본적으로 내가 관심있는 것(필드 등)을 SELECT를 FROM (테이블)에서 한다는 것이 요지인데, 다른 것은 그렇게 어렵지 않게 다가왔다. 하지만, HAVING은 처음 보는 형태다 보니, 사용법을 자꾸 까먹는 것 같다.

 

HAVING은 기본적으로 WHERE와 동일하게 조건문을 의미하지만, aggregate function을 사용하기 위해서는 WHERE말고 HAVING을 써야한다는 것이다. 다음은 이를 이해하기 위한 간단한 예제이다.

 

문제: "나라별로 10개 이상의 영화가 만들어진 경우에 대해 국가, 예산의 평균(avg_budget), 이익의 평균(avg_gross)에 대해 데이터를 가져와서, 나라 이름순으로 정렬해서 최대 5개만 보여줘라."

 

SELECT country, AVG(budget) as avg_budget, AVG(gross) as avg_gross
FROM films
GROUP BY country
HAVING count(title) >= 10
ORDER BY country
LIMIT 5;

 

films 란 테이블을 설명하자면, id, title, release_year, country, duration, language, certification, gross, budget이라는 열들이 쭉 나열되어 있다.

 

여기서 나라별로 10개 이상을 만들어 주기 위해, GROUP BY country로 나라별 그룹을 만들어준다.

 

그리고 10개 이상이란 조건을 충족시키려면, count를 활용해야 할텐데 여기서는 필드는 title로 해서 개수를 세어준다. 여기서 조건이라고 해서 WHERE를 쓰는 것이 아닌, HAVING을 사용하는 것이 필요하다.

 

조금 특이한 것은 5개만 데이터를 보여주라는 것인데, 이는 LIMIT 5로 쉽게 해결이 가능하다. 

반응형