다중 행 함수란 여러 데이터들이 하나의 함수에 들어가 하나의 결과값을 반환하는 함수를 의미한다.
따라서 다중 행 함수를 사용한 SELECT 절에는 기본적으로 여러 행이 결과로 나올 수 있는 열을 함께 사용할 수 없다.
이 다중행 함수의 종류에 대해 알아보자.
SUM 함수
- 지정한 데이터의 합 반환
- SUM( [DISTINCT, 또는 ALL 또는 아무값도 지정하지 않음] [합계를 구할 열이나 연산자, 함수를 사용한 데이터] )
select sum(distinct sal), sum(all sal), sum(sal) from emp;
중복을 제외한 급여의 합, 모든 급여의 합, 급여의 합이 차례로 구해지는 것을 볼 수 있다.
AVG 함수
- 지정한 데이터의 평균값 반환
- AVG( [DISTINCT, 또는 ALL 또는 아무값도 지정하지 않음] [평균을 구할 열이나 연산자, 함수를 사용한 데이터] )
OVER(분석을 위한 여러 문법 지정)
select avg(sal), avg(distinct sal) from emp;
급여의 평균, 중복을 제외한 급여의 평균을 구할 수 있다.
COUNT 함수
- 지정한 데이터의 개수 반환
- COUNT( [DISTINCT, 또는 ALL 또는 아무값도 지정하지 않음] [개수를 구할 열이나 연산자, 함수를 사용한 데이터)
OVER(분석을 위한 여러 문법 지정)
select count(empno) from emp;
사원들의 수를 구하는 SQL문이다. 또는
select count(distinct deptno) from emp;
위와같이 중복을 제거하여 부서의 수를 구할 수 있다.
MAX 함수
- 지정한 데이터 중 최댓값 반환
- MAX( [DISTINCT, 또는 ALL 또는 아무값도 지정하지 않음] [최댓값을 구할 열이나 연산자, 함수를 사용한 데이터)
OVER(분석을 위한 여러 문법 지정)
MIN 함수
- 지정한 데이터 중 최솟값 반환
- MIN( [DISTINCT, 또는 ALL 또는 아무값도 지정하지 않음] [최솟값을 구할 열이나 연산자, 함수를 사용한 데이터)
OVER(분석을 위한 여러 문법 지정)
select max(sal), min(sal) from emp;
위와 같이 MAX와 MIN을 이용하면 사원들 중 가장 높은 급여와 가장 적은 급여를 알 수 있다.
이처럼 다중 행 함수를 사용하면 평균, 갯수, 총합, 최댓값, 최솟값 등을 편리하게 알 수 있지만 조건식을 사용하기 까다로워진다. 예를 들어 부서별 평균 급여를 계산하기 위해서는
select avg(sal) from emp where deptno = 10;
select avg(sal) from emp where deptno = 20;
select avg(sal) from emp where deptno = 30;
위와같이 각각 부서를 지정하여 계산해주어야 하기 때문에 불편하다.
이와 같은 문제는 GROUP BY 함수를 이용하면 간편하게 해결할 수 있다.
GROUP BY
- 결과 값을 원하는 열로 묶어서 출력해주는 함수
- 특정 열 또는 데이터를 기준으로 데이터를 그룹으로 묶음
- 여러 데이터에서 하나의 결과를 특정 열 값 별로 묶어서 출력할 때 데이터를 그룹화 한다고 한다.
- SELECT [조회할 열1 이름], [열2 이름], …, [열N 이름] FROM [조회할 테이블 이름]
WHERE [조회할 행을 선별하는 조건식]
GROUP BY [그룹화할 열을 지정(여러 개 지정 가능)]
ORDER BY [정렬하려는 열 지정]
GROUP BY 함수를 이용하여 위의 부서별 평균 급여를 구해보자.
select deptno, avg(sal) from emp group by deptno;
위와 같이 각 부서별로 평균 급여를 구할 수 있다.
다만 다중행 함수를 사용하지 않은 일반 열은 GROUP BY 절에 명시하지않으면 SELECT 절에서 사용할 수 없다.
위에서는 deptno 가 GROUP BY 절에 명시되어 있지만 명시되지 않은 job(직업)을 넣게 되면 다음처럼 오류가 발생한다.
select job, deptno, avg(sal) from emp group by deptno;
HAVING
- GROUP BY 절에 조건을 줄 때 사용
- SELECT 문에 GROUP BY 절이 존재할 때에만 사용할 수 있음.
- GROUP BY 절을 통해 그룹화된 결과 값의 범위를 제한하는 데에 사용.
GROUP BY의 예시에서 deptno(부서번호)가 20인 부서의 평균 급여를 구해보도록 하자.
select deptno, avg(sal) from emp group by deptno having deptno = 20;
위와 같이 deptno(부서번호) 별로 데이터를 그룹화 한 뒤, 부서별로 평균값을 구한 후 deptno가 20인 부서의 평균급여만 출력하였다.
조건식을 지정한다는 점에서 HAVING절이 WHERE절과 비슷하다고 생각할 수 있다.
하지만 WHERE절은 출력 대상 행 을 제한하고, HAVING절은 그룹화된 대상에 대해 제한을 한다.