⛏️/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); |