GROUP BY / HAVING vs WHERE 정리

TJK·2025년 8월 22일
0

GROUP BY / HAVING vs WHERE 정리

WHERE, GROUP BY, HAVING은 SQL에서 데이터를 필터링하고 집계하는 핵심적인 절들입니다. SQLD 시험에서는 이 세 가지 절의 실행 순서사용 목적을 명확히 구분하는 문제가 자주 출제됩니다.


1. 핵심 개념 (★★★★★)

목적사용 대상집계 함수
WHERE개별 행(Row) 필터링FROM 절에서 가져온 개별 행사용 불가
GROUP BY그룹화FROM 절에서 가져온 행들을 그룹으로 묶음SELECT 절에서 함께 사용
HAVING그룹 필터링GROUP BY로 생성된 그룹사용 가능

2. SQL 실행 순서 (★★★★★)

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

  • WHEREGROUP BY보다 먼저 실행됩니다. → WHERE는 그룹핑하기 전에 데이터를 미리 줄여주는 역할을 합니다.
  • HAVINGGROUP BY가 실행된 이후에 그룹화된 결과에 조건을 적용합니다.

3. 주요 함정 포인트

  • WHERE 절에 집계 함수 사용:
    • WHERE COUNT(*) > 5와 같은 구문은 오류가 발생합니다. WHERE는 그룹핑 전 단계이므로 COUNT와 같은 집계 함수의 값을 알 수 없기 때문입니다.
  • HAVING 절 단독 사용:
    • GROUP BY 없이 HAVING을 사용할 수 있지만, 이 경우 테이블 전체를 하나의 그룹으로 간주합니다. 이 역시 시험에 자주 등장하는 함정입니다.
  • SELECT 절과 GROUP BY 절의 관계:
    • GROUP BY를 사용하면 SELECT 절에는 GROUP BY에 명시된 컬럼 또는 집계 함수만 올 수 있습니다. 다른 컬럼을 넣으면 오류가 발생합니다.

4. 최종 암기 팁

  • **W**here = **W**hole row filter (행 전체 필터링)
  • **H**aving = **H**aving group filter (그룹 필터링)

실전 기출 문제 스타일

1. 다음 쿼리 중 문법적으로 올바른 것은?
A. SELECT user_id, COUNT(*) FROM Orders HAVING COUNT(*) > 5;
B. SELECT user_id, COUNT(*) FROM Orders GROUP BY user_id WHERE COUNT(*) > 5;
C. SELECT user_id, COUNT(*) FROM Orders WHERE COUNT(*) > 5 GROUP BY user_id;
D. SELECT user_id, COUNT(*) FROM Orders WHERE user_id IN (SELECT user_id FROM Users);

2. WHEREHAVING의 사용 시점을 가장 정확하게 설명한 것은?
A. WHERESELECT 절보다 먼저 실행되고, HAVINGGROUP BY보다 먼저 실행된다.
B. WHEREGROUP BY 전에 개별 행에 조건을 적용하고, HAVINGGROUP BY 후에 그룹에 조건을 적용한다.
C. WHERE는 그룹에 조건을 적용하고, HAVING은 개별 행에 조건을 적용한다.
D. WHEREHAVING은 동일한 시점에 실행된다.

3. 다음 SQL의 실행 결과로 옳지 않은 것은?

SELECT deptno, COUNT(*)
FROM employees
GROUP BY deptno;

A. 각 부서별 직원 수가 출력된다.
B. SELECT 절에 deptnoCOUNT(*)만 존재하므로 올바른 구문이다.
C. WHERE 절이 없으므로 모든 부서의 데이터가 처리된다.
D. SELECT 절에 employee_name을 추가하면 오류가 발생한다.


정답 및 해설

  • 문제 1 정답: A, D
    • 해설: A는 GROUP BY가 없지만 테이블 전체를 하나의 그룹으로 보고 HAVING을 사용한 올바른 구문입니다. B와 C는 WHERE 절에 집계 함수를 사용해 오류가 발생합니다. D는 IN을 사용한 올바른 WHERE 구문입니다.
  • 문제 2 정답: B
    • 해설: WHEREGROUP BY 이전에 실행되어 개별 행을 필터링하고, HAVINGGROUP BY 이후에 실행되어 그룹화된 결과에 조건을 적용합니다.
  • 문제 3 정답: D
    • 해설: GROUP BY를 사용하면 SELECT 절에는 GROUP BY에 사용된 컬럼(deptno) 또는 집계 함수(COUNT(*))만 올 수 있습니다. employee_name은 그룹의 대표성이 없어 오류가 발생합니다.
profile
Hello world!

0개의 댓글