본문 바로가기
database/oracle

🌳 14편. 실무 고급 SQL 패턴 모음

by 죄니안죄니 2025. 5. 6.

🌳 14편. 실무 고급 SQL 패턴 모음

현업에서는 단순 SELECT 외에도 그룹 문자열 합치기, 순위 처리, 조건부 출력, JSON 처리와 같은 고급 SQL 기능이 자주 쓰입니다.
이번 글에서는 다음과 같은 고급 SQL 패턴들을 예제와 함께 소개합니다.

  • LISTAGG – 문자열 그룹 집계
  • RANK, DENSE_RANK – 순위 구하기
  • CASE WHEN – 조건 분기
  • ROLLUP – 소계/총계 자동 집계
  • JSON_OBJECT – JSON 생성

🔠 1. LISTAGG – 문자열을 그룹으로 묶어 출력


SELECT DEPTNO,
       LISTAGG(ENAME, ', ') WITHIN GROUP (ORDER BY ENAME) AS EMP_NAMES
FROM EMP
GROUP BY DEPTNO;

→ 부서별 사원 이름을 한 줄에 쉼표로 묶어서 출력


🏅 2. RANK / DENSE_RANK – 순위 구하기


SELECT ENAME, SAL,
       RANK() OVER (ORDER BY SAL DESC) AS RANKING,
       DENSE_RANK() OVER (ORDER BY SAL DESC) AS D_RANK
FROM EMP;
  • RANK: 공동 순위 시 다음 순위 건너뜀 (1,1,3)
  • DENSE_RANK: 공동 순위여도 건너뛰지 않음 (1,1,2)

🔀 3. CASE WHEN – 조건 분기


SELECT ENAME,
       SAL,
       CASE
         WHEN SAL >= 4000 THEN '고액 연봉'
         WHEN SAL >= 2000 THEN '중간 연봉'
         ELSE '저연봉'
       END AS 급여구간
FROM EMP;

→ SELECT 또는 WHERE, ORDER BY, GROUP BY 절에도 사용 가능


📊 4. ROLLUP – 소계 및 총계 자동 출력


SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB);

→ 각 부서/직무별 소계 + 부서별 소계 + 전체 합계를 한 번에 구함


📦 5. JSON_OBJECT – 쿼리 결과를 JSON으로 출력


SELECT JSON_OBJECT(
  'empno' VALUE EMPNO,
  'ename' VALUE ENAME,
  'deptno' VALUE DEPTNO
) AS emp_json
FROM EMP
WHERE ROWNUM <= 3;

→ Oracle 12c 이상부터 JSON 처리 지원 (TO_CLOB와 함께 사용 권장)


🧠 실무 팁

  • LISTAGG는 4000 byte 제한 존재 → 19c 이상은 ON OVERFLOW TRUNCATE 지원
  • RANK, OVER() 구문은 PARTITION BY와 함께 사용하면 그룹 내 순위 구분 가능
  • CASE WHEN동적 컬럼 생성, 다중 조건 처리에 매우 유용

📝 마무리

이번 글에서는 실무에서 자주 사용하는 고급 SQL 패턴들을 정리했습니다.
다음 글에서는 PARTITION 테이블과 대용량 테이블 설계 전략을 소개하겠습니다.

댓글