Category/SQL
GROUP BY 개념 정리
Corinee
2025. 2. 20. 16:39
728x90
GROUP BY란?
GROUP BY는 같은 값을 가진 행들을 하나의 그룹으로 묶는 역할을 합니다. GROUP BY가 적용되면 각 그룹마다 하나의 결과만 반환해야 하므로, SELECT에서 그룹 내부에서 어떤 값을 선택할지 명확하게 지정해야 합니다.
🔹 1. GROUP BY를 하면 그룹별로 한 줄만 반환됨
🔥 예제 1: GROUP BY 없이 모든 데이터 조회
SELECT FISH_TYPE, LENGTH
FROM FISH_INFO;
FISH_TYPE LENGTH
상어 | 250 |
상어 | 200 |
참치 | 180 |
참치 | 160 |
연어 | 150 |
연어 | 120 |
👉 GROUP BY를 사용하지 않았으므로, 모든 데이터가 개별적으로 출력됩니다.
🔥 예제 2: GROUP BY를 사용하면?
SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
GROUP BY FISH_TYPE;
FISH_TYPE MAX(LENGTH)
상어 | 250 |
참치 | 180 |
연어 | 150 |
👉 FISH_TYPE별로 그룹을 만들었고, 각 그룹에서 최대값(MAX(LENGTH))만 선택됩니다.
- GROUP BY를 하면 같은 FISH_TYPE을 가진 행들은 한 그룹으로 묶이고,
- SELECT에서 MAX(LENGTH) 같은 집계 함수(aggregation function, 예: MAX, MIN, SUM, AVG, COUNT)를 사용해야 합니다.
728x90
🔹 2. GROUP BY를 하면 SELECT에서 그룹 내부 조건을 지정해야 함
❌ 잘못된 예제: GROUP BY를 했는데 일반 컬럼을 그냥 SELECT함
SELECT FISH_TYPE, LENGTH -- LENGTH는 그룹별로 여러 개 존재하는데 하나만 선택됨
FROM FISH_INFO
GROUP BY FISH_TYPE;
💥 오류 발생 가능!
- LENGTH는 GROUP BY에 포함되지 않음 → 어느 값을 선택할지 애매하기 때문에 SQL이 오류를 발생시킬 수도 있음.
- MySQL에서는 임의의 값을 선택할 수도 있음 → 비일관적인 결과 가능성 있음.
✅ 올바른 예제: MAX(LENGTH)와 함께 서브쿼리 사용
WITH MAX_SIZE AS (
SELECT FISH_TYPE, MAX(LENGTH) AS MAX_LENGTH
FROM FISH_INFO
GROUP BY FISH_TYPE
)
SELECT I.ID, N.FISH_NAME, I.LENGTH
FROM FISH_INFO I
JOIN MAX_SIZE M
ON I.FISH_TYPE = M.FISH_TYPE AND I.LENGTH = M.MAX_LENGTH
JOIN FISH_NAME_INFO N
ON I.FISH_TYPE = N.FISH_TYPE
ORDER BY I.ID;
🔹 설명:
- MAX_SIZE에서는 FISH_TYPE별 최대 길이 (MAX(LENGTH))를 찾음.
- FISH_INFO 테이블과 JOIN하여 최대 길이를 가진 행만 필터링.
- FISH_NAME_INFO를 추가로 JOIN하여 물고기 이름 가져옴.
🔹 3. HAVING을 사용하여 그룹 내부 조건을 걸 수 있음
WHERE는 GROUP BY 적용 전에 실행되지만,
HAVING은 그룹을 만든 이후 그룹 내부에서 조건을 적용하는 역할을 함.
🎯 예제 3: HAVING으로 조건 걸기
SELECT FISH_TYPE, MAX(LENGTH) AS MAX_LENGTH
FROM FISH_INFO
GROUP BY FISH_TYPE
HAVING MAX_LENGTH > 150;
✅ 설명:
- GROUP BY로 FISH_TYPE별 최대 LENGTH를 찾음.
- HAVING을 사용해서 최대 길이가 150보다 큰 그룹만 선택.
✅ : GROUP BY 사용 시 SELECT와 조건 적용 방법
GROUP BY 없이 SELECT | 모든 데이터 개별 조회 |
GROUP BY + 집계 함수(MAX, SUM, AVG 등) | 그룹별로 특정 값을 선택 |
GROUP BY + HAVING | 그룹 내부에서 조건 필터링 |
WHERE + GROUP BY | GROUP BY 전에 데이터를 먼저 필터링 |
WITH(CTE) + JOIN | 그룹별 최대/최소 값을 찾고, 원본 테이블과 조인 |
🎯 한 문장으로 정리
GROUP BY를 하면 해당 그룹에서 하나의 결과만 나와야 하므로, SELECT에서 일반 컬럼을 그대로 쓰면 안 되고,
집계 함수(MAX, SUM, COUNT 등)로 값을 선택하거나, HAVING을 사용하여 그룹 내부 조건을 지정해야 합니다.
728x90