공부/인프런 - Rookiss

Part 5-2-9. SQL 입문 : GROUP BY

셩잇님 2024. 2. 12. 18:15
반응형

 

 

💅 SQL 입문

 

 지난 시간에는 이전까지 알아본 내용을 토대로 간단한 연습 문제를 풀어보았다. 오늘은 새로운 명령어인 GROUP BY에 대해서 알아보는 시간을 가져보도록 한다.

 


 

👻 GROUP BY

 

 GROUP BY는 컬럼을 그룹화 할 때 사용한다. 

 

예를 들어 2004년도 보스턴 팀 소속으로 출전한 선수들의 타격 정보는 알아보고 싶다면 다음과 같이 작성하면 될 것이다.

 

SELECT *
FROM batting
WHERE yearID = 2004 AND teamID = 'BOS'

 

그렇다면 만약 2004년도에 가장 많은 홈런을 날린 팀이 어딘지 알고 싶다면 어떻게 해야할까? 지금까지는 위와 같이 WHERE 절에 teamID등을 명시하여 작성했지만, 이젠 명시를 할 수 없으니 참 곤란하다.

 

어떻게 처리해야 할 지 과정을 생각해보자.

1. 각 팀별로 선수들이 2004년도에 친 홈런을 합친다.

2. 그 홈런의 합을 기준으로 정렬한다.

 

이때 1번 과정에 '각 팀별로'와 같이 그룹 별로 묶어 분석하고 싶은 경우 GROUP BY를 사용한다.

 

SELECT teamID, SUM(HR) AS homeRuns
FROM batting
WHERE yearID = 2004
GROUP BY teamID
ORDER BY homeRuns DESC;

 

 해당 쿼리문은 2004년도 팀별 홈런 수를 뽑아낼 테니, TOP 키워드를 이용하여 하나만 추출하면 가장 많은 홈런을 친 팀을 알 수 있을 것이다.

 




 그렇다면 질문을 바꿔 2004년도에 200개 이상의 홈런을 날린 팀들의 목록을 추출하려면 어떻게 해야할까? 뭔가 WHERE 절에 homeRuns를 이용하여 추가하면 될 것 같다.

 

SELECT teamID, SUM(HR) AS homeRuns
FROM batting
WHERE yearID = 2004 AND homeRuns >= 200
GROUP BY teamID
ORDER BY homeRuns DESC;

 

 homeRuns가 유효하지 않다는 오류를 뿜어내며 작동되지 않는다. 🤪 그 이유는 이전에 얘기 한 바와 같이 SELECT, FROM, WHERE 절의 실행 순서 때문이다.

 

SELECT teamID, SUM(HR) AS homeRuns
FROM batting
WHERE yearID = 2004
GROUP BY teamID
HAVING SUM(HR) >=200
ORDER BY homeRuns DESC;


 일단 해당 질문은 HAVING이라는 새로운 절을 추가해 해당 절에 위와 같이 SUM(HR) >=200을 추가하면 된다. HAVNING은 GROUP BY 그룹화 한 행에 조건을 추가하는 절이다. 어떻게 보면 제 2의 WHERE 절과 비슷하다.

 

 새롭게 생긴 HAVNIG까지의 sql의 실행 순서는 다음과 같으며, 주석에 적힌 바와 같이 비유를 통해 이해하면 된다.

--FROM 책상에서
--WHERE 공을 
--GROUP BY 색상별로
--HAVING 분류하고 빨간건 제외해주고 
--SELECT 갖고 와서 
--ORDER BY 크기별로 나열

 

 따라서 오류가 났던 이유는 당연히 WHERE절에서 homeRuns가 선언되어 있지 않아 오류가 났던 것이다.

 


 

 그렇다면 특정 년도가 아닌 단일 년도 가장 많은 홈런을 날린 팀을 추출하려면 어떻게 해야할까?

 

이 문제를 해결하기 위해서는 보스턴 팀이 2004년도에 친 홈런과, 보스턴 팀이 2005년도에 친 홈런의 정보는 아예 독립된 정보라는 것을 이해하면 된다. 즉 지금까지는 GROUP BY를 단순히 팀 이름으로만 구별했다면, 년도 까지 추가로 작성하여 구별하면 된다는 것을 의미한다. 

 

SELECT teamID, yearID, SUM(HR) AS homeRuns
FROM batting
GROUP BY teamID, yearID
ORDER BY homeRuns DESC;
--GROUP BY에 있는 열은 SELECT에서도 꺼내 쓸 수 있다.

 

 따라서 위와 같이 작성해주면 단일 년도 가장 많은 홈런을 친 팀을 추출할 수 있다. 만약 GROUP BY를 teamID, yearID로 구별하였다면, SELECT 문에서도 이미 GROUP BY를 통해 두 열을 구별해주었으므로 해당 열들을 추가해주어도 오류가 발생하지 않게 되므로 이를 참고하자. 😎

 

 

반응형