inblog logo
|
DailyCoding
    SQLD

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

    박은서's avatar
    박은서
    Feb 25, 2026
    2-1-4. GROUP BY절, HAVING절, ORDER BY절
    Contents
    1. 다중행 함수와 집계 함수1️⃣ 다중행 함수와 집계 함수의 기초 개념2️⃣ 다중행 함수의 종류 ⭐2. GROUP BY절1️⃣ GROUP BY절 기초 개념2️⃣ GROUP BY절 형식과 예3. HAVING절1️⃣ HAVING절 기초 개념2️⃣ HAVING절의 형식과 예3️⃣ 데이터를 필터링할 때 WHERE절 혹은 HAVING절의 차이4️⃣ 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
    Contents
    1. 다중행 함수와 집계 함수1️⃣ 다중행 함수와 집계 함수의 기초 개념2️⃣ 다중행 함수의 종류 ⭐2. GROUP BY절1️⃣ GROUP BY절 기초 개념2️⃣ GROUP BY절 형식과 예3. HAVING절1️⃣ HAVING절 기초 개념2️⃣ HAVING절의 형식과 예3️⃣ 데이터를 필터링할 때 WHERE절 혹은 HAVING절의 차이4️⃣ ORDER BY절

    DailyCoding

    RSS·Powered by Inblog