✅ GROUP BY란?

같은 값을 가진 행들을 하나의 그룹으로 묶어서 집계 연산(SUM, COUNT, AVG 등)을 수행할 때 사용합니다.

비유

  • FROM 책상에서
  • WHERE 공을
  • GROUP BY 색상별로
  • HAVING 빨간색 중 조건을 걸고
  • SELECT 가져오고
  • ORDER BY 정렬한다

📌 예제 테이블: batting

컬럼설명
playerID선수 ID
yearID시즌 연도
teamID팀 명칭
HR홈런 수

📝 문제 해결 예제


문제 1️⃣

2004년도 보스턴 팀 선수들의 타격 기록

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

문제 2️⃣

2004년도 팀별 홈런 합계

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

🔍 GROUP BY teamID: 팀별로 묶어서
🧮 SUM(HR): 홈런 합계 계산
🔽 ORDER BY: 홈런 수 내림차순 정렬


문제 3️⃣

2004년도에 200홈런 이상 기록한 팀 목록

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

HAVING은 집계된 결과에 조건을 걸 때 사용
WHERE에서는 SUM(HR)이나 homeRuns 별칭 사용 불가!


문제 4️⃣

단일 연도 기준으로 가장 많은 홈런을 기록한 팀

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

🎯 GROUP BY teamID, yearID: 팀 + 연도 조합으로 묶기
🔍 SELECT에서 teamID, yearID를 함께 사용 가능


✅ 실행 순서 요약

순서구문설명
1FROM테이블로부터 데이터 가져오기
2WHERE조건에 맞는 행 필터링
3GROUP BY같은 값을 가진 행들끼리 묶기
4HAVING그룹화된 결과에 조건 걸기
5SELECT필요한 열/계산된 값 선택
6ORDER BY결과 정렬

💡 추가 실전 예제

🔸 연도별 각 팀의 평균 홈런 수

SELECT yearID, teamID, AVG(HR) AS avgHR
FROM batting
GROUP BY yearID, teamID
ORDER BY yearID, avgHR DESC;

🔸 팀별 전체 홈런 수 (최소 1000개 이상)

SELECT teamID, SUM(HR) AS totalHR
FROM batting
GROUP BY teamID
HAVING SUM(HR) >= 1000
ORDER BY totalHR DESC;

🧠 기억할 것

  • GROUP BY집계함수와 함께 세트로 쓰인다.
  • HAVING집계된 결과에 조건을 걸 때만 사용!
  • SELECT에 포함된 열은 GROUP BY에 포함되어야 한다.
  • WHERE행 필터링, HAVING그룹 필터링

profile
李家네_공부방

0개의 댓글