2-1-4. GROUP BY절, HAVING절, ORDER BY절

박은서's avatar
Feb 25, 2026
2-1-4. GROUP BY절, HAVING절, ORDER BY절

1. 다중행 함수와 집계 함수

1️⃣ 다중행 함수와 집계 함수의 기초 개념

1) 다중행 함수

  • 여러 행을 대상으로 동작하는 함수
    • (대부분 집계 함수를 의미)

2) 집계 함수 (Aggregate Function)

  • SQL에서 여러 행의 데이터를 하나의 결과값으로 집계하는 데 사용되는 함수
  • 목적 : 데이터 요약, 계산, 통계 등
  • 함수 종류 : SUM(), AVG(), COUNT(), MAX(), MIN()
  • 집계 함수의 특성
    • 여러 행들의 그룹이 모여 그룹당 단 하나의 결과를 돌려주는 함수
    • GROUP BY 절은 행들을 소그룹화함
    • SELECT 절, HAVING 절, ORDER BY 절에서 사용할 수 있음

2️⃣ 다중행 함수의 종류 ⭐

💡
집계 함수, 순위 함수, 윈도우 함수가 주로 출제됨
통계 함수, 데이터 분석 함수는 거의 출제된 적 없음 (기본 개념 정도만 숙지)

1) 집계 함수 ⭐

(’2과목 1장 SQL 기본’에서 설명)
  • COUNT() : 행의 개수 계산
  • SUM() : 합계 계산
  • AVG() : 평균 계산
  • MAX() : 최댓값
  • MIN() : 최솟값
SELECT SUM(SAL) AS TOTAL_SALARY, AVG(SAL) AS AVERAGE_SALARY, COUNT(*) AS EMPLOYEE_COUNT, MAX(SAL) AS MAX_SALARY, MIN(SAL) AS MIN_SALARY FROM EMP;
TOTAL_SALARY
AVERAGE_SALARY
EMPLOYEE_COUNT
MAX_SALARY
MIN_SALARY
29025
2073.214
14
5000
800

2) 통계 함수

(’2과목 2장 SQL 활용’에서 설명)
집계 함수로 분류하기도 함
  • STDDEV() : 표준편차 계산
  • VARIANCE() : 분산 계산

3) 그룹 함수

(’2과목 2장 SQL 활용’에서 설명)
데이터 분석 함수로 분류하기도 함
  • LISTAGG() : 여러 행의 값을 하나의 문자열로 연결 (오라클)
  • STRING_AGG() : LISTAGG와 유사 (SQL Server)
  • GROUP_CONCAT() : LISTAGG와 유사 (My SQL)

4) 순위 함수 ⭐

(’2과목 2장 SQL 활용’에서 설명)
  • RANK() : 순위 계산 (동점 시 간격 발생)
  • DENSE_RANK() : 순위 계산 (동점 시 간격 없음)
  • ROW_NUMBER() : 각 행에 고유한 숫자 할당

5) 윈도우 함수 ⭐

(’2과목 2장 SQL 활용’에서 설명)
  • 위의 다중행 함수들을 OVER 절과 함께 사용하여 윈도우 함수로 활용 가능

2. GROUP BY절

1️⃣ GROUP BY절 기초 개념

1) GROUP BY절

  • SQL에서 데이터를 글룹화하는 데 사용되는 중요한 기능
  • 지정된 칼럼(열)의 값이 같은 행들을 하나의 그룹으로 묶음 → 집계 함수를 사용하여 그룹의 특성 파악하기 위함
  • 보고서, 통계, 데이터 요약 등의 실무에 자주 사용됨

2) HAVING절

  • GROUP BY절에서 칼럼을 그룹으로 묶을 때 특정 조건을 지정하고 싶은 경우에 HAVING절 사용
  • 그룹에 대한 조건 지정할 때 사용됨
  • 대부분 GROUP BY절과 함께 사용됨

2️⃣ GROUP BY절 형식과 예

1) 여러 열을 사용한 그룹화 예

SELECT DEPTNO, JOB, SUM(SAL) FROM EMP GROUP BY DEPTNO, JOB ORDER BY DEPTNO;
DEPTNO
JOB
SUM(SAL)
10
CLERK
1300
10
MANAGER
2450
10
PRESIDENT
5000
20
ANALYST
6000
20
CLERK
1900
20
MANAGER
2975
30
CLERK
950
30
MANAGER
2850
30
SALESMAN
5600

2) GROUP BY절에서 ALIAS(별칭) 사용 불가 ❌ ⭐

  • GROUP BY절에서는 ALIAS 사용 불가 ❌
    • SELECT로 ALIAS 지정되기 전에 GROUP BY절 수행되기 때문
  • ORDER BY절에서는 ALIAS 사용 가능 ⭕
    • SELECT절 이후에 수행되기 때문
SELECT DEPTNO AS NO, JOB AS JOB_NAME, SUM(SAL) AS SUM_SAL FROM EMP GROUP BY DEPTNO, JOB // 별칭 사용 불가 ORDER BY NO; // 별칭 사용 가능
DEPTNO
JOB
SUM(SAL)
10
CLERK
1300
10
MANAGER
2450
10
PRESIDENT
5000
20
ANALYST
6000
20
CLERK
1900
20
MANAGER
2975

3. HAVING절

1️⃣ HAVING절 기초 개념

  • GROUP BY절과 함께 자주 사용되며, 그룹화된 결과에 조건 적용할 때 사용
  • 필터를 통해 그룹 내에서 필터링된 값만 그룹화
  • HAVING절에는 주로 집계 함수(COUNT, AVG, SUM 등)가 사용됨
  • GROUP BY 없이 HAVING절을 사용할 수 있지만 드문 경우

2️⃣ HAVING절의 형식과 예

1) GROUP BY와 HAVING절 적용 예

SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) > 2000;
DEPTNO
AVG(SAL)
10
2916.667
20
2175

2) (오라클) GROUP BY와 HAVING절의 순서가 바뀐 경우

  • 오라클에서는 순서가 바뀌어도 에러가 발생하지 않음 (결과물 동일)
  • SQL Server에서는 에러 발생
SELECT DEPTNO, AVG(SAL) FROM EMP HAVING AVG(SAL) > 2000 GROUP BY DEPTNO;
DEPTNO
AVG(SAL)
10
2916.667
20
2175

3️⃣ 데이터를 필터링할 때 WHERE절 혹은 HAVING절의 차이

1) WHERE절에서 먼저 데이터 필터링하고 집계하는 방법

SELECT DEPTNO, AVG(SAL) FROM EMP WHERE SAL > 1500 GROUP BY DEPTNO;
⬇️ SAL이 1500 초과인 행을 먼저 필터링
ENAME
SAL
DEPTNO
KING
5000
10
BLAKE
2850
30
CLARK
2450
10
ALLEN
1600
30
JONES
2975
20
SCOTT
3000
20
FORD
3000
20
⬇️ 그 후에 DEPTNO별로 그룹화하여 평균 급여 계산
DEPTNO
AVG(SAL)
10
3725
30
2225
20
2991.667

2) HAVING절에서 데이터 필터링하는 방법

SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) > 2000;
⬇️ 모든 행을 DEPTNO별로 그룹화한 후 평균 급여가 2000 초과인 그룹 선택
DEPTNO
AVG(SAL)
10
2916.667
20
2175

3) 정리

  • WHERE절 : 그룹화 전 개별 행 필터링 (적용 대상 : 개별 행) → 집계 함수 사용 불가
  • HAVING절 : 그룹화 후 그룹에 대해 필터링 (적용 대상 : 그룹화된 결과) → 집계 함수 사용 가능
  • WHERE절과 HAVING절을 함께 사용하여 보다 정교한 데이터 필터링과 집계 가능

4️⃣ ORDER BY절

1) 단일 열 기준으로 오름차순 정렬

SELECT ENAME, JOB AS JOB_NAME, SAL FROM EMP ORDER BY SAL ASC;
ENAME
JOB_NAME
SAL
SMITH
CLERK
800
JAMES
CLERK
950
ADAMS
CLERK
1100
WARD
SALESMAN
1250

2) 단일 열 기준으로 내림차순 정렬

SELECT ENAME, JOB, SAL FROM EMP ORDER BY SAL DESC;
ENAME
JOB
SAL
KING
PRESIDENT
5000
SCOTT
ANALYST
3000
FORD
ANALYST
3000
JONES
MANAGER
2975

3) 여러 열 기준으로 정렬

SELECT ENAME, JOB, SAL, DEPTNO FROM EMP ORDER BY DEPTNO ASC, SAL DESC;
ENAME
JOB
SAL
DEPTNO
KING
PRESIDENT
5000
10
CLARK
MANAGER
2450
10
MILLER
CLERK
1300
10
SCOTT
ANALYST
3000
20
FORD
ANALYST
3000
20
JONES
MANAGER
2975
20
ADAMS
CLERK
1100
20
SMITH
CLERK
800
20
BLAKE
MANAGER
2850
30

4) 부서별로 가장 최근에 고용된 직원 찾기

SELECT ENAME, JOB, HIREDATE, DEPTNO FROM EMP ORDER BY DEPTNO ASC, HIREDATE DESC;
ENAME
JOB
HIREDATE
DEPTNO
MILLER
CLERK
1982-01-11
10
KING
PRESIDENT
1981-11-17
10
CLARK
MANAGER
1981-05-09
10
ADAMS
CLERK
1983-01-15
20
SCOTT
ANALYST
1982-12-22
20
FORD
ANALYST
1981-12-11
20
Share article