1. 핵심 원리
HAVING절을 사용하여 그룹 함수로 검색된 데이터 간의 비교를 수행합니다. 이는 그룹화된 데이터에 대해 특정 조건을 적용할 때 사용됩니다.
2. 실무에서 쓰이는 이유
HAVING절은 그룹 함수의 결과에 조건을 적용할 때 사용됩니다. WHERE절은 그룹화되기 전에 데이터 필터링에 사용되지만, HAVING절은 그룹화 후에 데이터 필터링에 사용됩니다. 이 기능은 그룹화된 데이터를 기반으로 특정 조건을 충족하는 데이터만 선택하는 데 필수적입니다.
3. 실무에서 구체적으로 사용되는 상황 예측
- 예시 1: 연간 매출액이 특정 금액 이상인 부서의 목록을 조회할 때.
- 예시 2: 일정 수 이상의 직원이 있는 부서의 목록을 확인할 때.
- 예시 3: 특정 직종의 평균 급여가 일정 금액 이상인 경우 해당 직종을 필터링할 때.
4. 자주 사용되는 윈도우 표시 및 설명
HAVING절과 함께 자주 사용되는 윈도우 함수는 다음과 같습니다:
- ROW_NUMBER(): 각 그룹 내에서 행의 순번을 매깁니다.
SELECT job, SUM(sal), ROW_NUMBER() OVER(PARTITION BY job ORDER BY SUM(sal) DESC) AS rn
FROM emp
GROUP BY job
HAVING SUM(sal) > (SELECT SUM(sal) FROM emp WHERE job='SALESMAN');
- RANK(): 순위를 매기되, 동일한 순위가 발생할 수 있습니다.
SELECT job, SUM(sal), RANK() OVER(PARTITION BY job ORDER BY SUM(sal) DESC) AS rank
FROM emp
GROUP BY job
HAVING SUM(sal) > (SELECT SUM(sal) FROM emp WHERE job='SALESMAN');
5. 연습 문제
직업별로 평균 급여가 3000 이상인 직업의 목록을 조회하세요.
6. 연습 문제 해답 및 테이블 표시
SELECT job, AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal) >= 3000;
7. 응용 문제
각 직업군에서 급여가 가장 높은 직원의 이름과 급여를 조회하세요.
8. 응용 문제 해답 및 테이블 표시
SELECT job, ename, sal
FROM emp
WHERE sal = (SELECT MAX(sal) FROM emp WHERE emp.job = job);
9. 전자상거래 업계에서 쓰일 수 있는 경우 예측
전자상거래 플랫폼에서 특정 제품군의 총 매출이 일정 기준 이상인 경우 해당 제품군의 목록을 조회하는 데 사용할 수 있습니다.
10. 전자상거래 업계에서 사용할 수 있는 경우 예상 상황 문제 2가지 및 그 경우에 대한 SQL 코드 작성
1) 특정 카테고리에서 총 매출이 일정 금액 이상인 카테고리를 조회하는 SQL:
SELECT category, SUM(sales)
FROM sales_data
GROUP BY category
HAVING SUM(sales) > 100000;
2) 특정 기간 동안 매출이 일정 금액 이상인 판매자의 목록을 조회하는 SQL:
SELECT seller_id, SUM(sales)
FROM sales_data
WHERE sale_date BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY seller_id
HAVING SUM(sales) > 50000;
11. 10번에 대한 SQL 코드를 시각적으로 이해하기 쉽도록 테이블 예시 작성
-- 테이블: sales_data
-- 컬럼: sale_id, seller_id, category, sales, sale_date
-- 예시 데이터:
-- sale_id | seller_id | category | sales | sale_date
-- 1 | 101 | 'Electronics' | 15000 | '2024-01-10'
-- 2 | 102 | 'Clothing' | 20000 | '2024-02-15'
-- 3 | 101 | 'Electronics' | 25000 | '2024-03-20'
-- 4 | 103 | 'Books' | 10000 | '2024-05-05'
-- 5 | 104 | 'Electronics' | 30000 | '2024-07-25'