그룹 함수를 사용할 때 주의해야 할 사항이 있습니다. 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함수 중 그룹 함수에 대해 정리해 보았습니다. 다음 글에서는 조인이라는 새로운 개념을 알아보겠습니다.
'Database > Oracle' 카테고리의 다른 글
[Oracle SQL] 조인(join) - ANSI 조인 (0) | 2022.05.12 |
---|---|
[Oracle SQL] 조인(join) - 오라클 조인 (0) | 2022.05.11 |
[Oracle SQL] SQL 함수 - 그룹 함수 (SUM, AVG, MAX, MIN, COUNT) (0) | 2022.05.11 |
[Oracle SQL] SQL 함수 - 단일행 함수 (5) 조건 함수 (0) | 2022.05.11 |
[Oracle SQL] SQL 함수 - 단일행 함수 (4) 변환 함수 (0) | 2022.05.10 |
댓글