본문 바로가기
Database/Oracle

[Oracle SQL] SQL 함수 - 그룹 함수 GROUP BY, HAVING

by Amy IT 2022. 5. 11.

그룹 함수를 사용할 때 주의해야 할 사항이 있습니다. SELECT 뒤에 일반 컬럼과 그룹 함수를 동시에 사용할 수 없다는 것입니다. 30번 부서에 속하는 사원들의 이름과 30번 부서의 인원수를 검색하고자 다음의 SQL문을 실행했을 때 오류가 발생하는 것을 확인할 수 있습니다.

SELECT ename, COUNT(*) FROM emp WHERE deptno=30;

30번 부서에 속하는 사원은 6명입니다. 이들의 이름을 출력하면 행이 6개인데, COUNT 함수를 통해 출력하는 인원수는 1개의 행입니다. 즉 서로 출력해야 되는 결과의 개수가 달라집니다. 이때 필요한 것이 GROUP BY 절입니다. 

 

 

 

1. GROUP BY 절

 

특정 컬럼값을 기준으로 그룹으로 묶을 때 사용합니다. 기본 문법은 다음과 같습니다.

SELECT [단순 컬럼,] 그룹함수1, 그룹함수2
FROM 테이블명
[WHERE 조건식]
[GROUP BY 단순 컬럼]
[ORDER BY 표현식];

이렇게 하면 GROUP BY 절에 기술된 단순 컬럼을 SELECT 절에서 그룹 함수와 같이 사용할 수 있게 됩니다. GROUP BY 절 사용시 주의해야할 점이 몇 가지 있습니다. GROUP BY 뒤에 기술된 컬럼만 SELECT 뒤에 기술할 수 있으며, GROUP BY 절에는 컬럼 별칭이나 컬럼 순서 위치값을 사용할 수 없고, WHERE 절에는 그룹 함수를 사용할 수 없다는 점입니다.

 

다음과 같이 부서번호와 함께 부서별 인원수를 구할 수 있습니다. 그룹으로 묶여진 것에 따라 그룹 함수도 실행됩니다.

SELECT deptno, COUNT(*) 
FROM emp
GROUP BY deptno;

 

여러 개의 컬럼을 사용하여 다중 그룹핑도 가능합니다. 다음은 사원들의 입사 연도별, 월별 월급 합계를 출력하는 SQL문입니다. 입사 연도를 기준으로 묶은 후, 다시 월을 기준으로 묶는 방법입니다.

SELECT TO_CHAR(hiredate,'YYYY') "년",
       TO_CHAR(hiredate,'MM') "월", SUM(sal)
FROM emp
GROUP BY TO_CHAR(hiredate,'YYYY'),
       TO_CHAR(hiredate,'MM')
ORDER BY 년;

 

 

 

2. HAVING 절

 

테이블에 저장된 데이터를 조회하기 위해 SELECT문을 사용하는데, 이때 WHERE절을 통해 SELECT문에서 조건을 지정하여 조건과 일치하는 데이터만 추출할 수 있습니다. 이와 달리 HAVING절은 GROUP BY절에 의해서 생성된 결과 중 조건과 일치하는 데이터를 추출하는 데 사용됩니다. 

5  SELECT [단순 컬럼,] 그룹함수1, 그룹함수2
1  FROM 테이블명
2  [WHERE 조건식]
3  [GROUP BY 단순 컬럼]
4  [HAVING 조건식]
6  [ORDER BY 표현식];

앞에 적어 놓은 숫자는 오라클이 SELECT문을 실행하는 순서입니다. 먼저 FROM절을 통해 테이블이 선택되고, 선택된 테이블에서 WHERE절에 지정된 조건과 일치하는 행들을 추출하게 됩니다. 추출된 데이터들은 GROUP BY절에 의해 그룹으로 묶이고, 그룹별로 묶인 데이터들 중 HAVING절에 의해 지정된 조건과 일치하는 행들만 다시 추출하게 됩니다. 추출된 행들 중 SELECT절에 명시된 컬럼을 ORDER BY절에 의해 정렬해서 보여줍니다. 

 

다음은 부서별로 월급 합계가 7000 이상인 부서만 추출하는 SQL문입니다.

SELECT deptno, SUM(sal) 
FROM emp
GROUP BY deptno
HAVING SUM(sal)>=7000
ORDER BY 1;

 

다음은 월급이 3000 이상인 사원에 대해서만, 부서별로 묶어서 부서별 월급 합계가 4000 이상인 부서만 추출하는 SQL문입니다.

SELECT deptno, SUM(sal)
FROM emp
WHERE sal>=3000
GROUP BY deptno
HAVING SUM(sal)>=4000
ORDER BY 1;

 

 

SQL함수 중 그룹 함수에 대해 정리해 보았습니다. 다음 글에서는 조인이라는 새로운 개념을 알아보겠습니다. 

 

 

댓글