[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part5: GROUP BY

참치와돌고래·2022년 11월 6일
0
post-custom-banner

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 절에 추가하면 될 것같은 느낌인데...

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절의 실행 순서 때문이다.

일단 해당 질문은 HAVING이라는 새로운 절을 추가해 그곳에

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

와 같이 SUM(HR)>=200을 추가하면 되겠다. sql의 실행 순서는 다음과 같으며, 주석에 적힌 바와 같이 비유를 통해 이해하면 된다.

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

...그러니까 오류가 났던 이유는 당연히 WHERE절에서 homeRUNS가 선언되어 있지 않아 오류가 났던 것이다.

조금 더 GROUP BY 이용을 확장하여, 단일 년도 가장 많은 홈런을 날린 팀을 추출하려면 어떻게 해야할까?

이 문제를 해결하려면, 보스턴 팀이 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를 통해 두 열을 구별해주었으므로 해당 열들을 추가해주어도 오류가 발생하지 않게 되니 참고하자.

post-custom-banner

0개의 댓글