group function
그룹 함수 : 그룹으로 요약하기
- 여러 행에 함수가 적용되어 하나의 결과를 나타내는 함수
- 집계 함수라고도 함
- GROUP BY : 기준 열에 대해 같은 데이터 값끼리 그룹을 묶고, 묶은 행의 집합에 대해 그룹 함수 연산이 필요한 경우, GROUP BY를 이용하여 처리
- HAVING : 묶은 그룹에 대해 조건이 필요하다면 HAVING 절을 이용
1. 그룹 함수의 종류와 사용법
- 굵게 표시된 부분은 필수 기본 문법
SELECT 그룹 함수(열 이름)
FROM 테이블 이름
[WHERE 조건식]
[ORDER BY 열 이름];
- 그룹 함수의 종류
함수 | 설명 | 예 | null처리 |
---|---|---|---|
COUNT | 행 개수를 셈 | COUNT(salary) | (*)의 경우 null 값도 개수로 셈 |
SUM | 합계 | SUM(salary) | null 값을 제외하고 연산 |
AVG | 평균 | AVG(salary) | null 값을 제외하고 연산 |
MAX | 최댓값 | MAX(salary) | null 값을 제외하고 연산 |
MIN | 최솟값 | MIN(salary) | null 값을 제외하고 연산 |
STDDEV | 표준편차 | STDDEV(salary) | null 값을 제외하고 연산 |
VARIANCE | 분산 | VARIANCE(salary) | null 값을 제외하고 연산 |
2. COUNT 함수
- COUNT는 지정한 열의 행 개수를 세는 함수
COUNT(열 이름)
(1) employees 테이블에서 salary 열의 행 수가 몇 개인지 세어서 출력하세요.
SELECT COUNT(salary) salary행수
FROM employees;
3. SUM, AVG 함수
- SUM : 열의 합계
- AVG : 열의 평균
SUM(열 이름) / AVG(열 이름)
(1) employees 테이블에서 salary의 합계와 평균을 구해 보세요. 또한 AVG 함수를 사용하지 말고 평균을 구해보세요.
SELECT SUM(salary) 합계, AVG(salary) 평균, SUM(salary)/COUNT(salary) 계산된평균
FROM employees;
- 실무 활용 팁 : AVG 합수는 null 값을 제외하고 연산함, null 값을 포함해서 평균을 계산해야 한다면 AVG(NVL(salary, o)) 형태로 계산해야 함
4. MAX, MIN 함수
- 모든 데이터 타입에 적용 가능
- 문자열의 경우 : 알파벳순, 날짜순 등으로 연산하여 결과를 출력함
MAX(열 이름) / MIN(열 이름)
(1) employees 테이블에서 salary의 최댓값과 최솟값, first_name의 최댓값과 최소값을 출력해 보세요.
SELECT MAX(salary) 최댓값, MIN(salary) 최솟값, MAX(first_name) 최댓값문자, MIN(first_name) 최솟값문자
FROM employees;
GROUP BY : 그룹으로 묶기
- SELECT 절에 열 이름과 그룹 함수를 함께 기술했다면 GROUP BY 절을 반드시 사용해야 함
- 그룹화는 열 이름 순서대로 수행됨
- WHERE 절을 사용하면 GROUP BY 보다 먼저 적용됨
- SELECT 절에 그룹 함수를 사용하지 않고 GROUP BY 절만으로도 사용할 수 있음
SELECT 기준 열, 그룹 함수(열 이름)
FROM 테이블 이름
[WHERE 조건식]
GROUP BY 열 이름
[ORDER BY 열 이름]
(1) employees 테이블에서 employee_id가 10 이상인 직원에 대해 job_id별로 그룹화하여 job_id별 총 급여와 job_id별 평균 급여를 구하고, job_id별 총 급여를 기준으로 내림차순 정렬하세요.
SELECT jobid 직무, SUM(salary) 직무별총급여, AVG(salary) 직무별평균급여
FROM employees
WHERE employee_id >= 10
GROUP BY job_id
ORDER BY 직무별총급여 DESC, 직무별_평균급여;
- 그룹에 대한 그룹이 필요한 경우
GROUP BY 대그룹, 중그룹, 소그룹
SELECT jobid job_id대그룹,
managerid manager_id중그룹,
SUM(salary) 그룹핑총급여,
AVG(salary) 그룹핑평균급여,
FROM employees
WHERE employeeid >= 10
GROUP BY job_id, manager_id
ORDER BY 그룹핑총급여 DESC, 그룹핑_평균급여;
HAVING : 연산된 그룹 함수 결과에 조건 적용하기
- HAVING 절은 그룹화된 값에 조건식을 적용할 때 사용(WHERE 절은 사용 불가)
SELECT 열 이름, 그룹 함수(열 이름)
FROM 테이블 이름
[WHERE 조건식]
GROUP BY 열 이름
[HAVING 조건절]
[ORDER BY 열 이름];
(1) employees 테이블에서 employees_id가 10 이상인 직원에 대해 job_id별로 그룹화하여 job_id별 총 급여와 job_id별 평균 급여를 구하되, job_id별 총 급여가 30000보다 큰 값만 출력하세요. 출력 결과는 job_id별 총 급여를 기준으로 내림차순 정렬하세요.
SELECT jobid 직무, SUM(salary) 직무별총급여, AVG(salary) 직무별평균급여
FROM employees
WHERE employee_id >= 10
GROUP BY job_id
HAVING SUM(salary) > 30000
ORDER BY 직무별총급여 DESC, 직무별_평균급여;