GROUP BY절
하나의 결과값을 출력하는 함수를 사용하여 부서 번호(DEPTNO)의 열 값별로 평균값을 구하려면 아래와 같이 각 부서 평균 값을 SELECT문을 하나하나 작성해야한다.
SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 10:
SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 20:
SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 30:
...
각 부서별 평균 급여를 통합해보려면 아래와 같이 집한 연산자를 사용할 수 있다.
SELECT AVG(SAL), '10' AS DEPTNO FROM EMP WHERE DEPTNO = 10
UNION ALL
SELECT AVG(SAL), '20' AS DEPTNO FROM EMP WHERE DEPTNO = 20
UNION ALL
SELECT AVG(SAL), '30' AS DEPTNO FROM EMP WHERE DEPTNO = 30;
하지만 이와 같은 방법은 번거롭다. 이를 해결하기 위해 GROUP BY절을 사용한다. GROUP BY절은 얻고자 하는 데이터의 결과를 특정 열 값으로 묶어 출력한다.
SELECT [조회할 열 1이름], [열2 이름], ..., [열N 이름]
FROM [조죄할 테이블 이름]
WHERE [조회할 행을 선별하는 조건식]
GROUP BY [그룹화할 열을 지정(여러 개 지정 가능)]
ORDER BY [정렬하려는 열 지정]
GROUP BY를 사용하여 부서별 평균 급여를 출력해보자.
SELECT AVG(SAL), DEPTNO
FROM EMP
GROUP BY DEPTNO;
각 부서별 평균 급여에 더해 직책 별 평균 급여로 정렬하는 쿼리문을 짜보자.
SELECT DEPTNO, JOB, AVG(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO, JOB;
GROUP BY절을 사용할 때 유의할 점은 다중행 함수를 사용하지 않은 일반 열은 GROUP BY절에 명시하지 않으면 SELECT절에서 사용할 수 없다.
GROUP BY절에 조건을 줄 때 사용하는 HAVING절
SELECT문의 WHERE절 처럼 GROUP BY도 조건절이 있다. HAVING절이다. WHERE절과 마찬가지로 범위를 제한하는 데 사용한다.
SELECT [조회할 열1 이름], [열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE [조회할 행을 선별하는 조건식]
GORUP BY [그룹화할 열 지정(여러 개 지정 가능)]
HAVING [출력 그룹을 제한하는 조건식]
ORDER BY [정렬하려는 열 지정];
HAVING절을 사용하여 평균 급여가 2000 이상 그룹의 결과를 출력해보자.
SELECT DEPTNO, JOB, AVG(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
HAVING AVG(SAL) >= 2000
ORDER BY DEPTNO, JOB;
출처:Do it! 오라클로 배우는 데이터베이스 입문(저자:이지훈 출판사:이지스퍼블리싱)
'DB > Oracle' 카테고리의 다른 글
[서브쿼리] 단일행 서브쿼리 (0) | 2022.02.14 |
---|---|
[서브쿼리] 서브쿼리의 정의 (0) | 2022.02.14 |
[다중행 함수] 하나의 열에 출력 결과를 담는 다중행 함수 (0) | 2022.02.10 |
[오라클 함수] 상황에 따라 다른 데이터를 반환하는 DECODE 함수와 CASE문 (0) | 2022.02.10 |
[오라클 함수] NULL 처리 함수 (0) | 2022.02.10 |