고래씌
[Oracle] 3. DML(SELECT) - GROUP BY & HAVING, 집합연산자 본문
1. GROUP BY 절
▶ 그룹을 묶어줄 기준을 제시할 수 있는 구문 => 그룹함수와 같이 쓰임
▶ 제시된 기준별로 그룹을 묶어줄 수 있음
▶ 여러개의 값들을 하나의 그룹으로 묶어서 처리할 목적으로 사용
[표현법]
GROUP BY 묶어줄 기준이 될 칼럼
▶ 각 부서별로 총 급여의 합계
▶ '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
: 차집합(선행 쿼리결과에서 후행 쿼리결과를 뺀 나머지)
'Database > Oracle' 카테고리의 다른 글
[Oracle] 4-2. DML(SELECT) - JOIN ② (OUTER JOIN, FULL OUTER JOIN) (0) | 2023.11.27 |
---|---|
[Oracle] 4-1. DML(SELECT) - JOIN ① (INNER JOIN) (0) | 2023.11.24 |
[Oracle] 2-7. DML(SELECT) - 함수 (그룹 함수) (0) | 2023.11.24 |
[Oracle] 2-6. DML(SELECT) - 함수_단일행 함수 ⑥ (선택 함수) (1) | 2023.11.24 |
[Oracle] 2-5. DML(SELECT) - 함수_단일행 함수 ⑤ (NULL 처리 함수) (0) | 2023.11.24 |