본문 바로가기

콩's EDUCATION/콩's DATABASE

오라클 데이터베이스 4강 다중 행 함수

오랜만이네요.

여러모로 이것저것 바쁘다 보니 1월 말에 이어 2월 말에 이어서 4강을 이어가 봅니다.

워크샵 공부를 하다 보니 SQL 파트를 소홀히 하는 것 같아 다시 시작해봤습니다.

 


 

다중행 함수 (MULTIPLE-ROW FUNCTION)

 

집합함수(Group functions)?

 

1) 종류 : SUM, AVG, MAX, MIN, COUNT

2) 데이터 형식 : SUM, AVG (오직 숫자), MAX, MIN, COUNT(문자, 숫자, 날짜 데이터 형식)

* LONG, CLOB 데이터 형식에서 MAX,MIN 사용불가!

 

cf) LONG :  최대 2GB 길이까지 가능한 문자 데이터 형식

    CLOB : 최대 [(4GB-1)*DATABASE BLOCK SIZE] BYTE 길이까지 가능한 문자 데이터 형식

* 데이터 블록 사이즈는 2048, 4096, .... 32768 Byte 중 하나이다.

 

3) 고려해야할 사항 : 집합함수와 ALL, DISTINCT 키워드를 같이 사용할 수 있다. Default는 ALL

4) 집함함수 사용시 데이터가 없으면 (NULL 상태, 값이 0 인 경우가 아니다!!) 필드는 없다고 판단한다.

    이때 NVL 함수를 사용한다.

 

집함함수 사용 예제는?

 

1) 입사일이 가장 오래된 날짜와 최근 날짜

 SELECT MIN(hire_date), MAX(hire_date)
FROM hr.employees;

2) 전체 직원

SELECT COUNT(*)

FROM hr.employees;

3) 현재 직원이 근무하고 있는 부서의 갯수

SELECT  COUNT(DISTINCT department_id)

FROM hr.employees;

4) 부서별 평균 임금

SELECT department_id, AVG(salary) AS "AVG_SAL_PER_DEPT" , COUNT(*) AS Persons
FROM hr.employees
GROUP BY department_id ;

5) 에러 상황

예제1)

SELECT department_id,job_id,AVG(salary)
FROM hr.employees
WHERE department_id in (10,20,30,40)
GROUP BY department_id ;

 

ORA-00979: not a GROUP BY expression (GROUP BY 표현식이 아니다.)

--> SELECT 절에서 집합함수와 같이 쓰인 컬럼중 하나인 JOB_ID가 누락되었기 때문에 생긴 에러이다.

 

예제2)

SELECT department_id, COUNT(last_name)
FROM hr.employees;

 

ORA-00937: not a single-group group function (GROUP BY 절이 누락되었다)

--> SELECT 절에서 집함함수와 같이 쓰인 컬럼인 department_id가 GROUP BY절에 기재되어야 한다.

 

예제3)

SELECT department_id,SUM(salary)
FROM hr.employees
WHERE SUM(salary) > 100000
GROUP BY department_id ;

 

ORA-00934: group function is not allowed here (GROUP BY절 자리가 아니다)

--> WHERE절에는 집함 함수를 사용할 수 없다.

--> HAVING 절을 사용한다.

 

SELECT department_id,SUM(salary)
FROM hr.employees
WHERE department_id = 60
GROUP BY department_id

HAVING SUM(salary) > 7000;

 

집합 함수는 중첩하여 사용가능?

 

예시) 

SELECT job_id
,SUM(CASE department_id when 10 then salary end) "Dept 10"
,SUM(CASE department_id when 20 then salary end) "Dept 20"
,SUM(CASE department_id when 30 then salary end) "Dept 30"
,SUM(CASE department_id when 40 then salary end) "Dept 40"
,SUM(CASE department_id when 50 then salary end) "Dept 50"
,SUM(CASE department_id when 60 then salary end) "Dept 60"
,SUM(CASE department_id when 70 then salary end) "Dept 70"
,SUM(CASE department_id when 80 then salary end) "Dept 80"
,SUM(CASE department_id when 90 then salary end) "Dept 90"
,SUM(CASE department_id when 100 then salary end) "Dept100"
,SUM(CASE department_id when 110 then salary end) "Dept110"
,SUM(CASE when department_id is null then salary end) "NODEPT"
,SUM(salary) "Total"
FROM hr.employees
GROUP BY job_id ;

 


 

집합 함수는 꽤 많이 사용하는 함수입니다.

       특히 집합 함수와 WHERE절 사용시에 문제점 그리고 이를 해결할 HAVING 절에 대한 구조를 잘 파악해야 합니다.

다음은 여러 테이블의 데이터를 조회하는 JOIN에 대해서 알아보겠습니다.