Post

[SQL] 케이스 함수

이번시간에는 CASE를 알아보겠습니다..조건식을 여러개 적용할 때는 DECODE 보다 CASE를 사용하는 것이 편합니다.

DECODE는 정확히 맞거나 틀린경우 조건을 처리하기 위한 반면 CASE는 조건의 범위가 다양한 경우 쉽게 처리할 수 있습니다.

1
2
3
4
5
6
7
8
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY,
    CASE
        WHEN SALARY >=9000 THEN '상위급여'
        WHEN SALARY BETWEEN 6000 AND 8999 THEN '중위급여'
        ELSE '하위급여'
    END AS 급여 등급
FROM EMPLOYEES
WHERE JOB_ID='IT_PROG';

급여 등급 칸을 만들어서 SALARY가 9000보다 크면 상위급여, 6000~8999사이면 중위급여 그렇지 않으면 하위급여로 출력하도록 했습니다. 그리고 IT_PROG 범위를 설정했습니다.

Desktop View

잘 나오네요 ㅎㅎ

#순위 매기기

RANK 공통 순위를 출력하되 공통 순위만큼 건너뛰어 다음 순위를 출력합니다

1,2,2,4

DENSE-RANK 공통 순위를 출력하되 건너뛰지 않고 바로 다음 순위를 출력합니다.

1,2,2,3

ROW_NUMBER 공통 순위를 없이 출력합니다.

1
2
SELECT EMPLOYEE_ID, SALARY, RANK() OVER(ORDER BY SALARY DESC) RANK_급여
FROM EMPLOYEES;

RANK()함수 옆에 OVER()함수가 있네요? 이것은 RANK()함수를 보조해준다고 생각하시면 됩니다. 급여의 내림차순으로 정리를 하고 급여를 기준으로 순위를 매겼습니다!

Desktop View 역시 잘 나옵니다!

1
2
3
SELECT JOB_ID, SUM(SALARY),AVG(SALARY)
FROM EMPLOYEES
GROUP BY JOB_ID;

GROUP BY JOB_ID로 이것을 다 묶은 뒤 SUM과 AVG를 썼습니다. 이런 그룹함수와 잘 어울립니다!

Desktop View

잘 나오죠?ㅎㅎ

1
2
3
4
SELECT JOB_ID, SUM(SALARY) 직무별총급여,AVG(SALARY),MANAGER_ID
FROM EMPLOYEES
GROUP BY JOB_ID, MANAGER_ID
ORDER BY 직무별총급여 DESC;

이런식으로 GROUP BY에 JOB_ID와 MANAGER_ID 2개를 넣으면 각각 모든 데이터가 나옵니다. 따라서 중복을 피할 순 없겠군요..

Desktop View

값이 잘 나오는 것을 확인할 수 있습니다

1
2
3
4
5
SELECT JOB_ID,SUM(SALARY) 직무별총급여,AVG(SALARY) 직무별평균급여
FROM EMPLOYEES
GROUP BY JOB_ID
HAVING SUM(SALARY) > 30000
ORDER BY 직무별총급여 DESC;

HAVING은 연산된 그룹 함수 결과에 조건을 적용합니다.

Desktop View

잘 나오네요 ㅎㅎ

UNION

SQL 을 이용해서 SELECT문의 실행 결과를 하나로 합칩니다. 즉, 각기 다른 두 개 이상의 SELECT문을 실행한 결과를 하나로 묶어서 출력할 수 있습니다. 집합을 하나로 묶을 때 사용하고 중복 행은 한번 출력합니다.

1
2
3
4
5
SELECT DEPARTMENT_ID
FROM EMPLOYEES
UNION
SELECT DEPARTMENT_ID
FROM DEPARTMENTS;

EMPLOYEES와 DEPARTMENTS의 DEPARTMENT_ID를 UNION했습니다. 따라서 두 테이블 안에 있는 같은 항목을 묶어서 출력이 되겠죠?

Desktop View

잘 나오네요 ㅎ

DML(DATA MANIPULATION LANGUAGE)

SELECT문의 경우는 단지 조회하여 출력만합니다.

INSERT(새로운 행삽입), UPDATE(갱신), DELETE(삭제)!

1
2
3
INSERT INTO DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME,MANAGER_ID,
                        LOCATION_ID)
                        VALUES(271,'SAMPLE_DEPT',200,1700);

INSERT로 DEPARTMENTS 테이블에 값을 넣었습니다. 각각의 항목에 순서대로 VALUES를 통해 넣으면 됩니다!

Desktop View

1
2
3
4
5
UPDATE DEPARTMENTS
SET MANAGER_ID =201,
    LOCATION_ID=1800

WHERE DEPARTMENT_NAME='SAMPLE_DEPT';

UPDATE는 수정입니다. SET을 통해서 MANAGER_ID와 LOCATION_ID를 바꾸려고 합니다. WHERE문으로 바꾸려는 값을 정할 수 있겠죠?

Desktop View

잘 바뀌었습니다!! 재밌네요 ㅎㅎ

1
2
3
UPDATE DEPARTMENTS
SET (MANAGER_ID,LOCATION_ID) = (SELECT MANAGER_ID,LOCATION_ID FROM DEPARTMENTS WHERE DEPARTMENT_ID=40)
WHERE DEPARTMENT_NAME='SAMPLE_DEPT';

이런식으로 값을 직접 지정하지 않아도 다른데서 가져온 값을 넣을 수 있습니다!

Desktop View

역시 잘 변경이 되었네요 ㅎㅎ신기합니다.

1
2
3
DELETE
FROM DEPARTMENTS
WHERE DEPARTMENT_NAME = 'SAMPLE_DEPT';

DELETE은 삭제입니다. 행 하나를 삭제하쥬~ 마찬가지로 WHERE문으로 지울 문장을 정할 수 있습니다!

Desktop View 없어졌습니다 ㅜㅜ

이번 시간엔 여기까지 하겠습니다!

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.