본문 바로가기
국비 교육/SQL(Oracle)

[오라클] 함수 function - 3

by 육츠 2024. 2. 4.
Contents 접기

기타 함수

함수 종류 사용
DECODE 다른 언어의 IF문과 유사한 개념의 함수

DECODE(exp1,   cond1, result1,
                            cond2, result2,
                            cond3, result3,
                             default
)
CASE~WHEN 자바 언어의 switch~case 와 유사한 개념의 함수

case when 조건식1 then 값1
     when 조건식2 then 값2
     else 값n
end

 

DECODE

select 
    first_name, department_id
    , decode(department_id, 10, 'Administration',
                            20, 'Maketing',
                            30, 'Purchasing',
                            40, 'Human Resources',
                            50, 'Shipping'
            ) as department_nm
            
            -- 107명을 다 조회한다.
from employees
where department_id in(10,20,30,40,50);
-- where department_name is not null --> X

 

CASE ~ WHEN 으로 변경

select 
    first_name, department_id
    , case when department_id = 10 then 'Administration'
            when department_id = 20 then 'Maketing'
            when department_id = 30 then 'Purchasing'
            when department_id = 40 then 'Human Resources'
            when department_id = 50 then 'Shipping'
            else 'etc'
       end as department_nm    
            -- 107명을 다 조회한다 
from employees;

 

그룹핑 함수

SUM(컬럼명) AVG(컬럼명) COUNT(컬럼명) MIN() / MAX(컬럼명)
합계 평균 개수 최소/최대

 

SUM() : 전체 결과가 레코드 개수만큼 나오지 않는다. 

salary 다 더한 값 하나만 나온다.

SELECT sum(salary)
from employees;

 

COUNT() : null 값 제외하고 개수를 샌다.

select count(employee_id)
from employees;
select count(commission_pct)
from employees;

 

COUNT() : null 값 제외하지 않고 모든 개수를 세려면?

select count(*)
from employees;

 

[Q] 부서별 최대 최소 급여를 조회

select min(salary), max(salary)
from employees;

 

[Q] 부서별 최대 최소 급여와 manager_id 를 조회

그룹핑과 관련없는 일반 컬럼이 select 절에 있으면 오류 발생한다.
따라서 select 문에서 manager_id 를 같이 조회하고 싶다면 group by 에도 manager_id 를 적어야 한다.

select department_id, min(salary), max(salary), manager_id
from employees
group by department_id, manager_id;

 

 

query - 조건문 

WHERE HAVING
일반 컬럼에 조건을 거는  grouping 정보에 출력 조건을 거는

 

[Q] job_id 별 급여의 평균을 구하시오. (기본 query 문)

select job_id, avg(salary)
from employees
group by job_id
order by 2;

 

[Q] job_id 별 급여의 평균과 job_id을 구하시오. (단, 급여의 평균이 5000 이상만 조회하시오)

select job_id, avg(salary)
from employees
group by job_id
having avg(salary) >= 5000
order by 2;

 

문제

[Q] 부서의 인원 수가 없거나 1명인 부서를 제외하여 조회하시오.

select department_id, count(*)
from employees
group by department_id
having department_id is not null
order by 1;
select department_id, count(*)
from employees
group by department_id 
having department_id is not null and count(*) != 1;

 

[Q] 입사년도별 입사인원을 조회하시오 (년도 4자리 입사인원)

SELECT MIN(입사인원) FROM
 (   
    SELECT 
        TO_CHAR(HIRE_DATE, 'YYYY')AS 입사년도
        , COUNT(*) AS 입사인원
    FROM 
        EMPLOYEES
    GROUP BY TO_CHAR(HIRE_DATE, 'YYYY')
    ORDER BY TO_CHAR(HIRE_DATE, 'YYYY')
) TEMP
WHERE 입사인원 = 1;

 

'국비 교육 > SQL(Oracle)' 카테고리의 다른 글

[오라클] DB 명령문 - 1  (0) 2024.02.05
[오라클] 서브 쿼리 Sub Query  (0) 2024.02.05
[오라클] 조인 JOIN  (0) 2024.02.04
[오라클] 함수 function - 2  (0) 2024.02.01