WHERE
, GROUP BY
, HAVING
은 SQL에서 데이터를 필터링하고 집계하는 핵심적인 절들입니다. SQLD 시험에서는 이 세 가지 절의 실행 순서와 사용 목적을 명확히 구분하는 문제가 자주 출제됩니다.
절 | 목적 | 사용 대상 | 집계 함수 |
---|---|---|---|
WHERE | 개별 행(Row) 필터링 | FROM 절에서 가져온 개별 행 | 사용 불가 |
GROUP BY | 그룹화 | FROM 절에서 가져온 행들을 그룹으로 묶음 | SELECT 절에서 함께 사용 |
HAVING | 그룹 필터링 | GROUP BY 로 생성된 그룹 | 사용 가능 |
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
WHERE
가 GROUP BY
보다 먼저 실행됩니다. → WHERE
는 그룹핑하기 전에 데이터를 미리 줄여주는 역할을 합니다.HAVING
은 GROUP BY
가 실행된 이후에 그룹화된 결과에 조건을 적용합니다.WHERE
절에 집계 함수 사용:WHERE COUNT(*) > 5
와 같은 구문은 오류가 발생합니다. WHERE
는 그룹핑 전 단계이므로 COUNT
와 같은 집계 함수의 값을 알 수 없기 때문입니다.HAVING
절 단독 사용:GROUP BY
없이 HAVING
을 사용할 수 있지만, 이 경우 테이블 전체를 하나의 그룹으로 간주합니다. 이 역시 시험에 자주 등장하는 함정입니다.SELECT
절과 GROUP BY
절의 관계:GROUP BY
를 사용하면 SELECT
절에는 GROUP BY
에 명시된 컬럼 또는 집계 함수만 올 수 있습니다. 다른 컬럼을 넣으면 오류가 발생합니다.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. WHERE
와 HAVING
의 사용 시점을 가장 정확하게 설명한 것은?
A. WHERE
는 SELECT
절보다 먼저 실행되고, HAVING
은 GROUP BY
보다 먼저 실행된다.
B. WHERE
는 GROUP BY
전에 개별 행에 조건을 적용하고, HAVING
은 GROUP BY
후에 그룹에 조건을 적용한다.
C. WHERE
는 그룹에 조건을 적용하고, HAVING
은 개별 행에 조건을 적용한다.
D. WHERE
와 HAVING
은 동일한 시점에 실행된다.
3. 다음 SQL의 실행 결과로 옳지 않은 것은?
SELECT deptno, COUNT(*)
FROM employees
GROUP BY deptno;
A. 각 부서별 직원 수가 출력된다.
B. SELECT
절에 deptno
와 COUNT(*)
만 존재하므로 올바른 구문이다.
C. WHERE
절이 없으므로 모든 부서의 데이터가 처리된다.
D. SELECT
절에 employee_name
을 추가하면 오류가 발생한다.
GROUP BY
가 없지만 테이블 전체를 하나의 그룹으로 보고 HAVING
을 사용한 올바른 구문입니다. B와 C는 WHERE
절에 집계 함수를 사용해 오류가 발생합니다. D는 IN
을 사용한 올바른 WHERE
구문입니다.WHERE
는 GROUP BY
이전에 실행되어 개별 행을 필터링하고, HAVING
은 GROUP BY
이후에 실행되어 그룹화된 결과에 조건을 적용합니다.GROUP BY
를 사용하면 SELECT
절에는 GROUP BY
에 사용된 컬럼(deptno
) 또는 집계 함수(COUNT(*)
)만 올 수 있습니다. employee_name
은 그룹의 대표성이 없어 오류가 발생합니다.