◆ 그룹 함수
- 데이터들의 합(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';
'DB' 카테고리의 다른 글
DB (6) DDL(CREATE) (0) | 2023.06.08 |
---|---|
DB (5) DML(SELECT) SUBQUERY (0) | 2023.06.05 |
DB (4) DML(SELECT) JOIN (0) | 2023.06.04 |
DB (2) DML(SELECT) 단일행 함수 (0) | 2023.05.30 |
DB (1) DML(SELECT) 기본문법 (2) | 2023.05.30 |