DB

DB (3) DML(SELECT) 그룹 함수

동동이임 2023. 6. 1. 12:08

◆ 그룹 함수

- 데이터들의 합(SUM), 데이터들의 평균(AVG)

- n개의 값을 읽어서 1개의 결과를 반환(하나의 그룹별로 함수 실행 결과 반환)

 

■ SUM(숫자타입컬럼)

- 해당 컬럼값들의 총합계를 반환해 주는 함수

ex)

-- 전체 사원들의 총 급여 합계
SELECT SUM(SALARY)
FROM EMPLOYEE;

-- 부서코드가 'D5'인 사원들의 총 급여 합계
SELECT SUM(SALARY)
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5';

 

■ AVG(숫자타입컬럼)

- 해당 컬럼값들의 평균을 구해서 반환해 준다.

ex)

SELECT ROUND(AVG(SALARY))
FROM EMPLOYEE; -- ROUND함수를 이용해 소수점 첫 번째 자리에서 올림처리 해준다.

 

MIN(ANY타입)

- 해당 컬럼값들 중 가장 작은 값을 반환해 준다.

 

 MAX(ANY타입)

- 해당 컬럼값들 중 가장 큰 값을 반환해 준다.

 

COUNT

- COUNT(*/컬럼이름/DISTINCT 컬럼이름) : 조회된 행의 개수를 세서 반환해 준다.

- COUNT(*) : 조회결과에 해당하는 모든 행의 개수를 다 세서 반환해 준다.
- COUNT(컬럼이름) : 제시한 해당 컬럼의 값이 NULL이 아닌 것만 세서 반환해 준다.
- COUNT(DISTINCT 컬럼이름) : 제시한 해당 컬럼값이 중복값이 있을 경우 하나로만 세서 반환해 준다.

 

▶ GROUP BY 절

- 그룹을 묶어줄 기준을 제시할 수 있는 구문 => 그룹함수와 같이 쓰인다.
- 해당 제시된 기준별로 그룹을 묶을 수 있다.
- 여러 개의 값들을 하나의 그룹으로 묶어서 처리할 목적으로 사용한다.

[표현법]
GROUP BY 묶어줄 기준이 될 컬럼

ex)

-- 각 부서별로 총 급여의 합계
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE; -- 부서별로 그룹을 짓겠다.

 

▶ HAVING 절

- 그룹에 대한 조건을 제시하고자 할 때 사용되는 구문

- 주로 그룹함수를 가지고 조건제시 => GROUP BY절과 함께 쓰인다.(뒤에)

ex)

-- 각 부서별 평균 급여가 350만원 이하인 부서만을 조회
SELECT DEPT_CODE 부서
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING ROUND(AVG(SALARY)) <= 3500000;

 

▶ ROLLUP / CUBE

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

ROLLUP(그룹기준에 해당하는 컬럼, 그룹기준에 해당하는 컬럼)
: 인자로 전달받은 그룹 중 가장 먼저 지정한 그룹을 기준으로 추가집계 결과를 반환해 준다.

CUBE(그룹기준에 해당하는 컬럼, 그룹기준에 해당하는 컬럼)
: 인자로 전달받은 그룹들로 가능한 모든 조합별 집계를 반환해준다.

ex)

SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY ROLLUP(DEPT_CODE, JOB_CODE)
ORDER BY 1;

SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY CUBE(DEPT_CODE, JOB_CODE)
ORDER BY 1;

 

▶ SELECT 문 구조 및 실행순서

5. SELECT 조회하고자 하는 컬럼명, *, 리터럴, 산술연산식, 함수식
1. FROM 조회하고자하는 테이블명/DUAL
2. WHERE 조건식(그룹함수X)
3. GROUP BY 그룹기준에 해당하는 컬럼명/함수식
4. HAVING 그룹함수식에 대한 조건식
6. ORDER BY 컬럼명/별칭/순번 [ASC/BESC] [NULLS FIRST/NULLS LAST]

 

▶ 집합 연산자 SET OPERATOR

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

※ 주의해야할점 : 두 쿼리문의 결과를 합쳐서 한 개의 테이블로 보여줘야하기 때문에 두 쿼리문의 SELECT절 부분은 같아야 한다.(조회할 컬럼명이 일치해야한다.)

 

UNION(합집합)

- UNION(합집합) : 두 쿼리문을 수행한 결과값을 더한 후 중복되는 부분은 한번만 빼서 중복을 제거한 것

ex) 

-- 부서코드가 D5이거나, 또는 급여가 300만원 초과인 사원들 조회(사번, 사원명, 부서코드, 급여)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' --> 6명 조회
UNION -- 12명 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000; --> 8명 조회

 

UNION ALL

- UNION ALL : 두 쿼리문을 수행한 결과값을 더한 후 중복값은 제거하지 않고 그대로 둔 것

ex) 

-- 직급코드가 J6이거나 또는 부서코드가 D1인 사원들 조
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE JOB_CODE = 'J6' --6명
UNION ALL -- 9명
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1'; -- 3명

 

INTERSECT(교집합)

- INTERSECT(교집합) : 두 쿼리문을 수행한 결과값의 중복된 부분만 가져온 것

ex)

-- 직급코드가 J6이면서 부서코드가 D1인 사원의 사번, 이름, 부서코드, 급여를 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE JOB_CODE = 'J6'
INTERSECT 
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1';

 

MINUS(차집합)

- MINUS(차집합) : 선행 쿼리문 결과값에서 후행 쿼리문 결과값을 뺀 나머지 부분

ex)

-- 직급코드가 J6인 사원들중에서 부서코드가 D1인 사원들을 제외한 나머지 사원들 조회해보기
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE JOB_CODE = 'J6' --6명
MINUS 
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1';