⛏️/Mysql | Oracle

[SQL] 14. 그룹 함수

defyuil 2023. 9. 7. 17:26

그룹 함수

  • 그룹 단위로 데이터를 입력받아 연산하는 종류의 함수
  • 그룹함수는 입력받은 그룹의 수만큼 결과가 출력된다.
  • 그룹 함수의 연산에는 기본적으로 NULL값은 제외한 값들로 연산을 한다.

 

MAX(최대) / MIN(최소)

  • MAX(expr) : 각 그룹에서 입력값에 대한 최대값을 돌려주는 함수
  • MIN(expr) : 각 그룹에서 입력값에 대한 최소값을 돌려주는 함수

 

  • 아래의 예제에서는 그룹 관련 작업을 하지 않아 테이블의 모든 행이 하나의 그룹으로 취급되며, 따라서 1개의 행 결과가 출력되었음.
  • 전 사원에 대한 급여 최소값과, 최대값을 그룹함수로 연산하여 출력
SELECT MIN(salary) AS "최소 급여", MAX(salary) AS "최대 급여"
FROM employees;



SELECT MIN(hire_date) AS "가장 오래된 입사일", MAX(hire_date) "가장 최근 입사일"
FROM employees;

 

SELECT MIN(last_name) AS "name1", MAX(last_name) AS "name2"
FROM employees;

 

 

 

  • 전 사원에 대한 LENGTH(last_name)의 결과값을 MAX, MIN 함수에 입력하여 가장 크고, 가장 작은 값을 돌려받음.
SELECT MIN(LENGTH(last_name)) AS "name1", MAX(LENGTH(last_name)) AS "name2"
FROM employees;

 

 

 

 

 

 

SUM(합계) / AVG(평균)

  • SUM(n) : 그룹 단위로 입력받은 숫자값들의 총합을 계산한다.
  • AVG(n) : 그룹 단위로 입력받은 숫자값들의 평균을 계산한다. 

 

  • 전 사원의 급여값을 입력하여 각각 합계와 평균을 계산
SELECT SUM(salary) AS "급여 합계", AVG(salary) AS "평균 급여"
FROM employees;



SELECT SUM(salary) AS "급여 합계", AVG(salary) AS "평균 급여"
FROM employees
WHERE job_id LIKE '%REP%';

 

 

  • NULL 값으로 인해서 평균의 연산에서는 오차가 크게 날 수도 있으므로 행 전체에 대한 평균을 연산할 때는 IFNULL과 같은 방법으로 NULL값을 처리해서 평균을 구할 수 있다.
SELECT AVG(commission_pct), AVG(IFNULL(commission_pct, 0))
FROM employees;

 

 

 

COUNT(*) / COUNT([DISTINCT] expr)

COUNT(expr)

  • 그룹 단위로 입력값의 수를 카운트하는 함수. NULL값을 제외한 값들을 카운트한다.

 

SELECT COUNT(last_name), COUNT(department_id), COUNT(manager_id), COUNT(commission_pct)
FROM employees;

 

 

 

 

COUNT(*)

  • 행의 수를 카운트하기 때문에 NULL값을 고려하지 않아도 된다. '*' 은 COUNT 함수에서만 사용가능한 방법이다.

 

SELECT COUNT(*)
FROM employees;

 

 

COUNT(DISTINCT expr)

  • 입력받은 값들에서 중복값을 제거한 값을 카운트한다.
  • 실제 중복값을 제거한 행의 수는 12개 행이 출력된다.
SELECT DISTINCT department_id
FROM employees;

 

 

  • DISTINCT를 적용한 결과는 중복값제거와 NULL값의 데이터가 빠지면서 11개의 행에 대해서만 카운트하였기 때문.
SELECT COUNT(DISTINCT department_id)
FROM employees;

 

 

 

 

GROUP BY절

  • 그룹의 단위를 만드는 기준을 설정하는 절 
  • GROUP BY절에 명시된 기준으로 동일한 값을 가진 행끼리 동일한 그룹으로 묶이게 된다. 또한 묶을 때 사용한 값은 그룹의 이름으로 사용된다.
  • 그룹 함수를 사용하는 경우 SELECT절에는 GROUP BY절의 기준값만 그룹 이름 목적으로 출력이 가능하다.

 

 

  • department_id가 동일한 값인 사원들끼리 그룹을 묶고 그룹의 이름으로 SELECT절에 department_id를 작성하여 출력한다.
SELECT department_id, COUNT(*), AVG(salary)
FROM employees
GROUP BY department_id;

 

 

 

 

 

 

기준 값이 여럿인 경우

  • 여러 기준값을 사용하여 그룹을 만드는 경우 기준의 모든 값들이 동일해야지만 같은 그룹으로 묶이게되며 기준값들 중 하나라도 다른 값이 있다면 다른 그룹으로 취급된다.
  • 이때도 마찬가지로 GROUP BY절에 사용된 컬럼들만 SELECT절에 작성이 가능하며 의무적으로 사용할 필요는 없으며, 부분적으로 사용하거나 사용하지 않아도 상관없다.

 

  • 아래와 같이 department_id, job_id 두가지 기준으로 그룹을 묶는 경우 동일 부서, 동일 직무를 동시에 만족해야 같은 그룹으로 묶이게 된다.
SELECT department_id, job_id, COUNT(*), AVG(salary)
FROM employees
GROUP BY department_id, job_id;

 

 

HAVING절

  • GROUP BY절에 의해서 생성된 그룹들을 제한(필터링)하는 옵션절
  • HAVING절에는 조건의 기준으로 그룹함수를 사용한다.
  • 연산자는 WHERE과 동일하다.

 

각 절의 적용 순서

SELECT job_id, SUM(salary) PAYROLL
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING SUM(salary) > 13000
ORDER BY SUM(salary);