고래씌

[Oracle] 3. DML(SELECT) - GROUP BY & HAVING, 집합연산자 본문

Database/Oracle

[Oracle] 3. DML(SELECT) - GROUP BY & HAVING, 집합연산자

고래씌 2023. 11. 24. 14:50

1. GROUP BY 절

▶ 그룹을 묶어줄 기준을 제시할 수 있는 구문 => 그룹함수와 같이 쓰임
제시된 기준별로 그룹을 묶어줄 수 있음
여러개의 값들을 하나의 그룹으로 묶어서 처리할 목적으로 사용
    
    [표현법]
    GROUP BY 묶어줄 기준이 될 칼럼

 

EMPLOYEE 테이블

 

▶ 각 부서별로 총 급여의 합계

 

 

▶ 'D1'부서의 총 급여 합

 

 

▶ 각 부서별 총 급여합을 부서별 오름차순으로 정렬해서 조회

 

=> 실행순서
① FROM
② GROUP BY
③ SELECT
④ ORDER BY

 

 

각 직급별로 직급코드, 총 급여의 합, 사원수, 보너스를 받는 사원수, 평균급여, 최고급여, 최소급여

 

 

성별 별 사원수
성별 : SUBSTR(EMP_NO,8,1)

 

 

▶ 성별 기준으로 평균 급여

 

▶ 각 부서별로 평균 급여가 300만원 이상인 부서들만 조회

 

☞ 이 코드는 오류 발생. WHERE절에 그룹함수를 사용할수가 없다!

 


2. HAVING 절

: 그룹에 대한 조건을 제시하고자 할 때 사용하는 구문
(주로 그룹함수를 가지고 조건 제시) => GROUP BY절과 함께 쓰인다.

 

 각 부서별로 평균 급여가 300만원 이상인 부서들만 조회

 

 

각 직급별 총 급여합이 1000만원 이상인 직급 코드, 급여 합을 조회

 

 

 각 부서별 보너스를 받는 사원이 없는 부서만을 조회

 


3. ROLLUP과 CUBE

: 그룹별 산출결과 값의 "집계"를 계산하는 함수

 

- ROLLUP(그룹 기준에 해당하는 칼럼명/함수식, 그룹 기준에 해당하는 칼럼명/함수식) :
 인자로 전달받은 그룹중 가장 먼저 지정한 그룹을 기준으로 추가 집계 결과를 반환해줌
    
- CUBE(그룹 기준에 해당하는 칼럼명/함수식, 그룹 기준에 해당하는 칼럼명/함수식) :
  인자로 전달받은 그룹들로 가능한 모든 조합별 집계를 반환해줌

 

▶ ROLLUP

 

☞  JOB_CODE를 제외한 DEPT_CODE에 대한 추가집계 결과만 반환

 

▶ CUBE

 

모든 조합별 통계를 구함

 


4. SELECT문 구조 및 순서

  ⑤ SELECT   조회하고자하는 컬럼명들 / * / 리터럴/ 산술연산식/ 함수식
  ① FROM     조회하고자 하는 테이블 명 / DUAL(가상테이블)
  ② WHERE   조건식(그룹함수는 사용불가)
  ③ GROUP BY 그룹 기준에 해당하는 칼럼명 / 함수식
  ④ HAVING  그룹함수식에 대한 조건식
  ⑥ ORDER BY  정렬하고자하는 칼럼명/순번/별칭 [ASC/DESC] [NULLS FIRST/LAST]

 


5. 집합 연산자 SET OPERATOR

: 여러 개의 쿼리문을 가지고 하나의 쿼리문으로 만드는 연산자

 

- UNION(합집합) : 두 쿼리문을 수행한 결과값(REUSLTSET)을 더한 후 중복되는 부분은 한번빼서 중복을 제거한 것
- UNION ALL : 두 쿼리문을 수행한 결과값을 더한 후 중복되는 값은 제거하지 않은 것
- INTERSECT(교집합) : 두 쿼리문을 수행한 결과값의 중복된 부분만 남긴것
- MINUS(차집합) : 선행 쿼리문의 결과값에서 후행 쿼리문의 결과값을 뺀 나머지 부분
    
※ 주의해야할 점 : 두 쿼리문을 실행한 결과를 합쳐서 한개의 RESULTSET으로 보여줘야하기 때문에 두 쿼리문을 수행한 SELECT절 부분은 동일해야한다. → 즉, 조회할 칼럼이 동일해야한다.

 

 

1) UNION (합집합)

: 두 쿼리문을 수행한 결과값을 더하지만 중복은 제거

 

이것을 UNION을 이용해서 합치면....

 

☞ 대북혼, 심봉선은 부서가 D5이면서 300만원 초과이기 때문에 중복값은 제거됨(12명)

 

 

2) UNION ALL

: 여러개의 쿼리결과를 더해서 보여주는 연산자(중복값을 제거하지 않음)

 

▶ 직급코드가 J6이거나 부서코드가 D1인 사원들만 조회(사번, 사원명, 부서코드, 직급코드)

 

3) INTERSECT

: 교집합, 여러 쿼리 결과의 중복된 결과만을 조회

 

 

 

4) MINUS

: 차집합(선행 쿼리결과에서 후행 쿼리결과를 뺀 나머지)