Ch.14 SQL 심화 + 풀스택 연결

GROUP BY와 서브쿼리

GROUP BY로 데이터를 그룹화하여 집계할 수 있다HAVING으로 그룹 필터링을 할 수 있다WHERE와 HAVING의 차이를 설명할 수 있다

부서별 평균 급여를 한 번에 구하려면?

매출 보고서: 월별 매출, 카테고리별 판매량, 고객별 구매 횟수 — 그룹으로 묶어서 집계하는 방법

그룹별 통계를 한 번에 계산하려면?

GROUP BY — 데이터를 그룹으로 묶고 집계 함수를 적용하여 요약 통계를 만드는 문법입니다.


article

핵심 내용

같은 값을 가진 행들을 하나의 그룹으로 묶어 집계합니다

-- 부서별 직원 수
SELECT department, COUNT(*) AS 직원수
FROM employees
GROUP BY department;

-- 결과:
-- department | 직원수
-- 개발팀     | 15
-- 디자인팀   | 8
-- 마케팅팀   | 12

-- 부서별 평균 급여
SELECT department, AVG(salary) AS 평균급여
FROM employees
GROUP BY department
ORDER BY 평균급여 DESC;

FROM: 테이블에서 모든 행 가져오기

GROUP BY: 같은 값끼리 그룹으로 묶기

집계 함수: 그룹별 COUNT, AVG, SUM 계산

결과: 그룹당 한 행으로 요약

GROUP BY 규칙 SELECT에 쓰는 열은 반드시 GROUP BY에 포함되거나 집계 함수 안에 있어야 합니다. 예: `SELECT department, name` ← name은 GROUP BY에 없으므로 에러!

그룹화한 결과에서 조건에 맞는 그룹만 필터링합니다

-- 실전 예: 2건 이상 주문한 고객
SELECT user_id, COUNT(*) AS 주문수
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 2
ORDER BY 주문수 DESC;

WHERE vs HAVING 핵심 차이 WHERE = 그룹화 개별 행 필터링 HAVING = 그룹화 그룹 필터링 HAVING에는 집계 함수(COUNT, AVG 등) 사용 가능!

쿼리 안에 또 다른 쿼리 서브쿼리(Subquery) 입니다

-- WHERE절 서브쿼리: 평균 나이보다 많은 사용자
SELECT name, age
FROM users
WHERE age > (SELECT AVG(age) FROM users);

-- FROM절 서브쿼리: 부서별 통계를 다시 집계
SELECT AVG(dept_avg) AS 전체평균
FROM (
  SELECT department, AVG(salary) AS dept_avg
  FROM employees
  GROUP BY department
) AS dept_stats;

-- IN과 서브쿼리: 주문한 적 있는 사용자
SELECT name FROM users
WHERE id IN (
  SELECT DISTINCT user_id FROM orders
);

서브쿼리 vs JOIN 같은 결과를 만들 수 있는 경우가 많습니다. 간단한 조건 → 서브쿼리가 읽기 쉬움 복잡한 결합 → JOIN이 성능과 가독성에 유리

그룹화 후 조건을 걸 때 사용하는 키워드는?

WHERE 절에서 COUNT(*) 같은 집계 함수를 사용할 수 있다

부서별 직원 수를 구하는 SQL: SELECT department, COUNT(*) FROM employees ___ BY department;

GROUP BY 정복!

edit_note

정리 노트

GROUP BY와 서브쿼리 정리

GROUP BY

GROUP BY
동일한 값을 가진 행을 그룹으로 묶어 집계
HAVING
그룹화 이후 조건 필터링 — WHERE는 그룹화 이전
WHERE vs HAVING
WHERE = 행 필터, HAVING = 그룹 필터

서브쿼리

서브쿼리
SQL 안에 또 다른 SQL — 괄호로 감싸서 사용
WHERE 서브쿼리
WHERE price > (SELECT AVG(price) ...) — 동적 조건
FROM 서브쿼리
가상 테이블(인라인 뷰)로 중간 결과를 생성

GROUP BY는 '같은 카테고리끼리 모아서 집계'하는 패턴입니다.

check_circle

핵심 정리

  • 1GROUP BY 열 — 같은 값끼리 그룹으로 묶어 집계
  • 2HAVING — 그룹화 후 조건 필터 (WHERE는 그룹화 전)
  • 3서브쿼리 — 쿼리 안의 쿼리, WHERE절·FROM절에서 사용
  • 4서브쿼리 vs JOIN — 상황에 따라 적절히 선택

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작