본문 바로가기
Sql

GROUP BY 와 HAVING

by 헬로제이콥 2025. 7. 7.

✅ 1. GROUP BY 와 HAVING

📌 개념 차이

항목설명
GROUP BY 데이터를 기준값으로 묶어서 집계할 때 사용 (예: 부서별 평균)
HAVING GROUP BY로 묶은 결과에 조건을 걸 때 사용
WHERE GROUP BY 하기 전에 데이터를 필터링
 

✅ 예제 1: 부서별 평균 급여 구하기 (GROUP BY)

sql
복사편집
SELECT dept_id, AVG(salary) AS avg_salary FROM employees GROUP BY dept_id;

▶ dept_id 별로 묶어서 평균 salary 계산


✅ 예제 2: 평균 급여가 3000 이상인 부서만 보기 (HAVING)

sql
복사편집
SELECT dept_id, AVG(salary) AS avg_salary FROM employees GROUP BY dept_id HAVING AVG(salary) >= 3000;

▶ GROUP BY로 부서별 평균을 구한 뒤
▶ HAVING으로 평균 3000 이상인 부서만 추출


✅ 예제용 테이블 구조

sql
복사편집
CREATE TABLE employees ( emp_id NUMBER, emp_name VARCHAR2(50), dept_id NUMBER, salary NUMBER ); INSERT INTO employees VALUES (1, '홍길동', 10, 2800); INSERT INTO employees VALUES (2, '이순신', 10, 3200); INSERT INTO employees VALUES (3, '강감찬', 20, 4000); INSERT INTO employees VALUES (4, '유관순', 20, 3000);

→ dept_id 10 평균 = 3000
→ dept_id 20 평균 = 3500


✅ 2. ORDER BY

📌 개념

  • 결과를 정렬하는 키워드
  • 기본은 오름차순 (ASC), 내림차순은 DESC

✅ 예제 1: 급여 순으로 직원 정렬

sql
복사편집
SELECT emp_name, salary FROM employees ORDER BY salary DESC;

▶ 급여 높은 순으로 정렬


✅ 예제 2: 부서 오름차순, 같은 부서 내에서는 급여 높은 순

sql
복사편집
SELECT emp_name, dept_id, salary FROM employees ORDER BY dept_id ASC, salary DESC;

✅ 3. 자주 쓰는 SQL 명령어 요약표

명령어설명
SELECT 데이터 조회
FROM 대상 테이블 지정
WHERE 조건 필터링
GROUP BY 그룹별 집계
HAVING 그룹 집계 조건
ORDER BY 정렬
JOIN 여러 테이블 연결 (INNER, LEFT, RIGHT 등)
IN 리스트 내 포함 조건
BETWEEN 범위 조건 (예: BETWEEN 1000 AND 2000)
EXISTS 서브쿼리 존재 여부 체크
CASE WHEN 조건 분기 (if처럼 사용)
DISTINCT 중복 제거
LIMIT / FETCH FIRST 결과 개수 제한
RANK() / ROW_NUMBER() 순위 계산용 함수
 

✅ 추가 예제: 종합 문제

부서별로 급여 총합을 구하고, 5000 이상인 부서만 표시하되,
급여 총합이 높은 순으로 정렬

sql
복사편집
SELECT dept_id, SUM(salary) AS total_salary FROM employees GROUP BY dept_id HAVING SUM(salary) >= 5000 ORDER BY total_salary DESC;

✅ 초보자 분석 순서 요약

  1. FROM → 어떤 테이블?
  2. WHERE → 사전 필터링?
  3. GROUP BY → 묶는 기준?
  4. HAVING → 그룹 조건?
  5. ORDER BY → 정렬 기준?
  6. SELECT → 최종으로 보여줄 컬럼?

✅ 추가로 배우면 좋은 것들

영역추천 주제
JOIN INNER JOIN, LEFT JOIN
집계 함수 SUM(), AVG(), COUNT(), MAX()
서브쿼리 SELECT절, WHERE절, HAVING절에 사용
윈도우 함수 RANK(), ROW_NUMBER(), OVER()
조건 분기 CASE WHEN THEN END
INSERT/UPDATE/DELETE DML 기본 조작