[SQL] 케이스 함수
📌 들어가며
이번 글에서는 CASE, 순위 함수(RANK), GROUP BY/HAVING, UNION, 그리고 DML(INSERT/UPDATE/DELETE)을 다룬다.
CASE vs DECODE: DECODE는 정확히 일치하는 조건에, CASE는 범위가 다양한 조건에 편리하다.
1. CASE — 범위 조건 분기
1
2
3
4
5
6
7
8
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY,
CASE
WHEN SALARY >= 9000 THEN '상위급여'
WHEN SALARY BETWEEN 6000 AND 8999 THEN '중위급여'
ELSE '하위급여'
END AS 급여등급
FROM EMPLOYEES
WHERE JOB_ID = 'IT_PROG';
💡
CASE WHEN 조건 THEN 값 ... ELSE 값 END. 범위(>=,BETWEEN) 조건을 여러 개 처리할 때 DECODE보다 직관적이다.
2. 순위 함수
| 함수 | 공통 순위 처리 | 예 |
|---|---|---|
RANK() | 건너뛰고 다음 순위 | 1, 2, 2, 4 |
DENSE_RANK() | 건너뛰지 않음 | 1, 2, 2, 3 |
ROW_NUMBER() | 공통 순위 없이 | 1, 2, 3, 4 |
1
2
SELECT EMPLOYEE_ID, SALARY, RANK() OVER(ORDER BY SALARY DESC) RANK_급여
FROM EMPLOYEES;
💡
OVER(ORDER BY ...)는 순위 함수를 보조해 어떤 기준으로 순위를 매길지 정한다.
3. GROUP BY와 HAVING
1
2
3
4
5
6
7
8
9
SELECT JOB_ID, SUM(SALARY), AVG(SALARY)
FROM EMPLOYEES
GROUP BY JOB_ID; -- 직무별 그룹핑
SELECT JOB_ID, SUM(SALARY) 직무별총급여
FROM EMPLOYEES
GROUP BY JOB_ID
HAVING SUM(SALARY) > 30000 -- 그룹 결과에 조건
ORDER BY 직무별총급여 DESC;
💡
GROUP BY로 묶어 집계함수(SUM/AVG)와 잘 어울린다.HAVING은 집계 결과에 조건을 건다(WHERE는 집계 전 행에 조건).GROUP BY에 컬럼 2개를 넣으면 조합별로 세분화된다.
4. UNION — 결과 합치기
1
2
3
SELECT DEPARTMENT_ID FROM EMPLOYEES
UNION
SELECT DEPARTMENT_ID FROM DEPARTMENTS;
💡
UNION은 둘 이상의SELECT결과를 하나로 합친다. 집합처럼 묶으며 중복 행은 한 번만 출력한다.
5. DML — INSERT / UPDATE / DELETE
SELECT가 조회만 한다면, DML은 데이터를 변경한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- INSERT (행 삽입)
INSERT INTO DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID)
VALUES(271, 'SAMPLE_DEPT', 200, 1700);
-- UPDATE (수정)
UPDATE DEPARTMENTS SET MANAGER_ID=201, LOCATION_ID=1800
WHERE DEPARTMENT_NAME='SAMPLE_DEPT';
-- 서브쿼리로 값 가져와 수정
UPDATE DEPARTMENTS
SET (MANAGER_ID, LOCATION_ID) =
(SELECT MANAGER_ID, LOCATION_ID FROM DEPARTMENTS WHERE DEPARTMENT_ID=40)
WHERE DEPARTMENT_NAME='SAMPLE_DEPT';
-- DELETE (삭제)
DELETE FROM DEPARTMENTS WHERE DEPARTMENT_NAME='SAMPLE_DEPT';
💡
UPDATE ~ SET (...) = (SELECT ...)처럼 서브쿼리로 다른 데이터를 가져와 값을 넣을 수도 있다.
📝 정리
1
2
3
4
5
6
CASE · 순위 · 집계 · DML
├─ CASE WHEN~THEN~ELSE~END (범위 조건)
├─ 순위 RANK/DENSE_RANK/ROW_NUMBER + OVER
├─ 집계 GROUP BY + HAVING(집계 결과 조건)
├─ UNION 두 SELECT 결과 합침 (중복 1회)
└─ DML INSERT/UPDATE/DELETE (+ 서브쿼리)
| 개념 | 한 줄 정의 |
|---|---|
| CASE | 범위 조건 분기 |
| RANK 계열 | 공통 순위 처리 방식 차이 |
| HAVING | 집계 결과에 조건 |
| UNION | 여러 SELECT 결과 합치기 |
CASE는 범위 조건에, RANK는 순위 매기기에, HAVING은 집계 후 필터에 쓰인다. 특히 WHERE(집계 전)와 HAVING(집계 후)의 차이를 잡아두면 복잡한 집계 쿼리도 어렵지 않다.
This post is licensed under CC BY 4.0 by the author.







Comments powered by Disqus.