SQL

03. GROUP_BY , HAVING

비보호신호등 2024. 8. 14. 12:45

<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