03. GROUP_BY , HAVING
<GROUP BY절>
그룹기준을 제시할 수 있는 구문(해당 그룹기준별로 여러 그룹을 묶을 수 있음)
여러개의 값들을 하나의 그룹으로 묶어서 처리하는 목적으로 사용
EX)
각 부서별로 급여 총합
각 부서들이 전부 그룹
1
2
3
4
|
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
|
cs |
<HAVING 절>
그룹에 대한 조건을 제시할 때 사용되는 구문(주로 그룹함수식을 가지고 조건을 만든다)
EX)
각 부서별 평균급여가 300만원 이상인 부서들만 조회(부서코드 평균급여)
1
2
3
4
5
|
SELECT DEPT_CODE, ROUND(AVG(SALARY))
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING AVG(SALARY) >= 3000000;
|
cs |
<실행 순서>
SELECT * | 조회하고 싶은 컬럼들 | 함수식 | 산술연산 -----------5
FROM 조회하고싶은 테이블 | DUAL ------------------- 1
WHERE 조건식 -------------------- 2
GROUP BY 그룹의 기준이 되는 컬럼 | 함수식 ----------------- 3
HAVING 조건식 ------------------- 4
ORDER BY 컬럼 | 별칭 | 순서 [ASC | DESC] [NULLS FIRST | NULLS LAST] ---- 6
<집합연산자>
여러 개의 쿠리문을 하나의 쿼리문으로 만드는 연산자
- UNION : OR | 합집합(두 쿼리문 수행한 결과값을 더한다.)
- INTERSECT : AND | 교집합(두 퀴리문의 수행한 결과값에 중복된 결과값)
- UNION ALL : 합집합 + 교집합 (중복되는 거 상관않고 전부 더한 결과값)
- MINUS : 차집합(선행결과값에 후행결과값을 뺸 나머지)
1. UNION
EX)
부서코드가 D5인 사원 또는 급여가 300만원 초과인 사원들의 사번, 이름, 부서코드, 급여 조회
(UNION 사용)
1
2
3
4
5
6
7
|
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
|
cs |

2. INTERSECT
부서코드가 D5이면서 급여도 300만원 초과 사원들의 사번, 이름, 부서코드. 급여조회
1
2
3
4
5
6
7
|
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
INTERSECT
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
|
cs |

집합연산자 사용시 주의사항
1. 컬럼의 갯수가 동일해야한다.
2. 컬럼자리마다 동일한 타입으로 기술해야한다.
3. 정렬하고 싶다면 ORDER BY는 마지막에 기술한다.
3. UNION ALL
여러 개의 쿼리 결과를 무조건 다 더한다. (중복 상관X)
4. MINUS
선행 SELECT 결과에서 후행 SELECT결과를 뺀 나머지
1
2
3
4
5
6
7
8
|
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
MINUS
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000
ORDER BY EMP_ID;
|
cs |