Ch.14 SQL 심화 + 풀스택 연결
GROUP BY와 서브쿼리
부서별 평균 급여를 한 번에 구하려면?
매출 보고서: 월별 매출, 카테고리별 판매량, 고객별 구매 횟수 — 그룹으로 묶어서 집계하는 방법
그룹별 통계를 한 번에 계산하려면?
GROUP BY — 데이터를 그룹으로 묶고 집계 함수를 적용하여 요약 통계를 만드는 문법입니다.
핵심 내용
같은 값을 가진 행들을 하나의 그룹으로 묶어 집계합니다
-- 부서별 직원 수
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 정복!
정리 노트
GROUP BY와 서브쿼리 정리
GROUP BY
- GROUP BY
- 동일한 값을 가진 행을 그룹으로 묶어 집계
- HAVING
- 그룹화 이후 조건 필터링 — WHERE는 그룹화 이전
- WHERE vs HAVING
- WHERE = 행 필터, HAVING = 그룹 필터
서브쿼리
- 서브쿼리
- SQL 안에 또 다른 SQL — 괄호로 감싸서 사용
- WHERE 서브쿼리
- WHERE price > (SELECT AVG(price) ...) — 동적 조건
- FROM 서브쿼리
- 가상 테이블(인라인 뷰)로 중간 결과를 생성
GROUP BY는 '같은 카테고리끼리 모아서 집계'하는 패턴입니다.
핵심 정리
- 1GROUP BY 열 — 같은 값끼리 그룹으로 묶어 집계
- 2HAVING — 그룹화 후 조건 필터 (WHERE는 그룹화 전)
- 3서브쿼리 — 쿼리 안의 쿼리, WHERE절·FROM절에서 사용
- 4서브쿼리 vs JOIN — 상황에 따라 적절히 선택
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작