최근에 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로 쉽게 해결이 가능하다.
'SQL' 카테고리의 다른 글
SQL로 이동평균(MA; Moving Average) 구하기 (0) | 2020.08.17 |
---|---|
SQL 랭킹 매기기_올림픽 메달 획득 순위 구하기 (0) | 2020.08.17 |
백분율을 계산하는 다른 방법_ AVERAGE 이용하기 (0) | 2020.08.11 |
SQL_INNER, LEFT, FULL JOIN의 비교_나라별 code에 맞춰 테이블 JOIN하기 (1) | 2020.08.08 |
SQL에서 일정 조건을 만족하는 필드 가져오기 (CASE WHEN과 self join해서 ON 이용하기) (0) | 2020.08.03 |