오늘은 몰랐으면 내일은 알면 된다

2022-11-08 (5) 다중행 함수, GROUP BY 본문

Java/JAVA 개발자 양성과정

2022-11-08 (5) 다중행 함수, GROUP BY

마스터피쓰 2022. 11. 8. 16:09
함수 설명
SUM 지정한 데이터의 합 반환
COUNT 지정한 데이터의 개수 반환
COUNT() - NULL 제외하고 카운트
COUNT(*) - NULL 포함하고 카운트
MAX 지정한 데이터 중 최댓값 반환
MIN 지정한 데이터 중 최솟값 반환
AVG 지정한 데이터의 평균값 반환
SELECT SUM(DISTINCT SAL),
	SUM(ALL SAL),
    SUM(SAL)
FROM EMP;

ALL을 사용한 것과 아무것도 붙이지 않은 것의 결과는 같다. 그러나 DISTINCT를 붙이면, 같은 결과 값을 가진 데이터는 한번만 사용된다.(자주 사용되지 않음)


[GROUP BY]

SELECT 		[조회할 열1 이름], [열2 이름], ..., [열N이름]
FROM 		[조회할 테이블 이름]
WHERE 		[조회할 행을 선별하는 조건식]
GROUP BY 	[그룹화할 열을 지정(여러개 지정 가능)]
ORDER BY 	[정렬하려는 열 지정]

GROUP BY 에 명시하는 열은 여러 개 지정할 수 있다. 먼저 지정한 열로 대그룹을 나누고, 그 다음 지정한 열로 소그룹을 나눈다.

다중행 함수를 사용하지 않은 일반 열은 GROUP BY 절에 명시하지 않으면 SELECT 절에서 사용할 수 없다. 사용을 위해서는 서브쿼리를 활용해야 한다.

SELECT ENAME, DEPTNO, AVG(SAL)
FROM EMP
GROUP BY DEPTNO;

예를들어 위의 경우, DEPTNO를 기준으로 그룹화되어 DEPTNO, AVG(SAL)은 한 행으로 출력되지만, ENAME은 여러 행으로 출력되기 때문에 오류가 발생한다.

 

[HAVING]

: GROUP BY절이 존재할 때만 사용할 수 있다. 그룹화된 결과 값의 범위를 제한하는 데 사용한다.

SELECT 		[조회할 열1 이름], [열2 이름], ..., [열N이름]
FROM 		[조회할 테이블 이름]
WHERE 		[조회할 행을 선별하는 조건식]
GROUP BY 	[그룹화할 열을 지정(여러개 지정 가능)]
HAVING 		[출력 그룹을 제한하는 조건식]
ORDER BY 	[정렬하려는 열 지정]

 

[WHERE / HAVING]

: WHERE이 출력 행을 제한하는 데 반해, HAVING은 그룹화된 대상을 출력에서 제한한다.

WHERE이 GROUP BY와 HAVING을 사용한 데이터 그룹화보다 먼저 출력 대상이 될 행을 제한한다.

SELECT DEPTNO, JOB, AVG(SAL)
FROM EMP
WHERE SAL <= 3000
GROUP BY DEPTNO, JOB
HAVING AVG(SAL) >= 2000
ORDER BY DEPTNO, JOB;

예를들어 위의 경우, WHERE SAL <= 3000 을 통해 먼저 SAL이 3000을 초과하는 데이터를 결과에서 제외한다. 따라서 애초에 GROUP BY 대상이 될 수 없다.

 

이처럼, 그룹을 나누는 대상 데이터를 처음부터 제외하려고 할 때, WHERE절을 함께 사용한다.