GROUP BY절
- - GROUP BY 절은 데이터들을 원하는 그룹으로 나눌 수 있다.
- - 나누고자 하는 그룹의 컬럼명을 SELECT절과 GROUP BY절 뒤에 추가하면 된다.
- - 집계함수와 함께 사용되는 상수는 GROUP BY 절에 추가하지 않아도 된다. (개발자 분들이 많이 실수 함)
- - 아래는 집계 함수와 상수가 함께 SELECT 절에 사용되는 예이다.
1
2
3
4
5
6
7
8
9
10
11
12 |
-- 부서별 사원수 조회 SELECT '2005년' year , deptno 부서번호, COUNT (*) 사원수 FROM emp GROUP BY deptno ORDER BY COUNT (*) DESC ; YEAR 부서번호 사원수 ------ ---------- ---------- 2005년 30 6 2005년 20 5 2005년 10 3 |
아래 예제는 부서별로 그룹하여 부서번호, 인원수, 급여의 평균, 급여의 합을 조회하는 예제이다.
1
2
3
4
5
6
7
8
9
10
11 |
SELECT deptno, COUNT (*), ROUND( AVG (sal)) "급여평균" , ROUND( SUM (sal)) "급여합계" FROM emp GROUP BY deptno; DEPTNO COUNT (*) 급여평균 급여합계 -------- ---------- ---------- ---------- 30 6 1567 9400 20 5 2175 10875 10 3 2917 8750 |
아래 예제는 업무별로 그룹하여 업무, 인원수, 평균 급여액, 최고 급여액, 최저 급여액 및 합계를 조회하는 예제이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
SELECT job, COUNT (empno) "인원수" , AVG (sal) "평균급여액" , MAX (sal) "최고급여액" , MIN (sal) "최저급여액" , SUM (sal) "급여합계" FROM emp GROUP BY job; JOB 인원수 평균급여액 최고급여액 최저급여액 급여합계 ----------- -------- ---------- ---------- ---------- ---------- CLERK 4 1037.5 1300 800 4150 SALESMAN 4 1400 1600 1250 5600 PRESIDENT 1 5000 5000 5000 5000 MANAGER 3 2758.33333 2975 2450 8275 ANALYST 2 3000 3000 3000 6000 |
- - GROUP BY 절은 집계 함수 없이도 사용 될 수 있다.(DISTINCT와 용도가 비슷해 짐)
- - 아래 예제를 보면 GROUP BY는 말 그대로 그룹을 나누는 역할을 한다.
1
2
3
4
5
6
7
8
9
10
11 |
-- GROUP BY를 이용한 부서번호 조회 예 SELECT deptno FROM emp GROUP BY deptno; DEPTNO ------ 30 20 10 |
DISTINCT와 GROUP BY절
- - DISTINCT와 GROUP BY 개념에 대해서 좀 더 이해를 해보자.
- - DISTINCT는 주로 UNIQUE(중복을 제거)한 컬럼이나 레코드를 조회하는 경우 사용한다.
- - GROUP BY는 데이터를 그룹핑해서 그 결과를 가져오는 경우 사용한다.
- - 하지만 두 작업은 조금만 생각해보면 동일한 형태의 작업이라는 것을 쉽게 알 수 있으며, 일부 작업의 경우 DISTINCT로 동시에 GROUP BY로도 처리될 수 있는 쿼리들이 있다.
- - 두 기능 모두 Oracle9i까지는 sort를 이용하여 데이터를 만들었지만, Oracle10g 부터는 모두 Hash를 이용하여 처리한다.
- - 그래서 DISTINCT를 사용해야 할지, GROUP BY를 사용해서 데이터를 조회하는 것이 좋을지 고민되는 경우들이 가끔 있다.
아래의 예제는 동일한 결과를 반환한다.
1
2
3
4
5
6
7
8
9
10
11
12
13 |
-- DISTINCT를 사용한 중복 데이터 제거 SELECT DISTINCT deptno FROM emp; -- GROUP BY를 사용한 중복 데이터 제거 SELECT deptno FROM emp GROUP BY deptno; DEPTNO ------ 30 20 10 |
하지만 곰곰히 생각해 보면 GROUP BY와 DISTINCT는 각자 고유의 기능이 있다
집계함수를 사용하여 특정 그룹으로 구분 할 때는GROUP BY 절을 사용하며, 특정 그룹 구분없이 중복된 데이터를 제거할 경우에는 DISTINCT 절을 사용 하도록 하자
1
2
3
4
5
6
7
8
9
10
11 |
-- 아래와 같은 기능은 DISTINCT를 사용하는 것이 훨씬 효율적이다. SELECT COUNT ( DISTINCT d.deptno) "중복제거 수" , COUNT (d.deptno) "전체 수" FROM emp e, dept d WHERE e.deptno = d.deptno; -- 집계 함수가 필요한 경우는 GROUP BY를 사용해야 한다. SELECT deptno, MIN (sal) FROM emp GROUP BY deptno; |
'Programming > DataBase' 카테고리의 다른 글
[oracle] 날짜함수 (0) | 2014.03.20 |
---|---|
[oracle] TRUNC 함수 (0) | 2014.03.20 |
[Mysql] sqlgate mysql 키보드 이상 현상 (0) | 2013.07.12 |
[MSSQL] Cannot insert explicit value for identity column in table (0) | 2013.02.26 |
[MsSql] 문자-날짜-형변환 쿼리 (0) | 2013.01.30 |