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를 통해 두 열을 구별해주었으므로 해당 열들을 추가해주어도 오류가 발생하지 않게 되니 참고하자.