때로는 데이터를 그룹화해서 값을 집계할 필요가 있는 경우가 많다. 예를 들면 모 회사의 시도별(서울시,세종시,강원도,충청도 등) 대리점들의 매출합산을 구하는 경우이다.
위와 같은 데이터를 조회할때는 GROUP BY절과 (SELECT의 WHERE 처럼) GROUP BY절의 행을 제약하는 HAVING 절을 배워야 한다.
GROUP BY
- 특정 열들을 그룹화하고 집계/요약하기 위하여 SELECT문에 포함하여 사용한다.
- 사용 구문은 다음과 같다.
GROUP BY simple_group_by_item [ , ...n ]
- simple_group_by_item : 그룹화할 열 또는 열을 참조하는 연산식이다.
- SELECT 문의 열 목록에 있는 집계식이 아닌 모든 열은 simple_group_by_item에 포함되어야 한다.
- 대부분의 경우에는 SELECT 문의 열 목록에 집계 함수가 포함된다.
- ORDER BY 절을 이용하여 그룹화할 열을 정렬하는 것이 권장된다.(하지 않으면 그룹 자체가 정렬되지 않을 수 있기 때문)
- GROUP BY 절의 개념도는 아래와 같다.
'
왼쪽의 orders 테이블에 대해 buyer_id와 product_id 순으로 그룹화 하고 각 그룹에 대하여 SUM(qty)로 qty 총 값을 집계한 것이 오른쪽 테이블이다.
위의 개념도를 SQL 쿼리를 이용하여 구현하면 다음과 같다.
라인 2에서 개념도의 좌측 테이블을 만들고,
라인 3,4에서 개념도의 우측 테이블을 만드는데, buyer_id와 product_id를 이용하여 그룹화 시키고 정렬을 한다.
그 결과는 아래와 같다.
위의 결과는 ORDER BY를 사용했을 때의 결과이다. 아랫부분의 결과가 중요하기 때문에 잘 봐두길 바란다.
만약에 GROUP BY만 사용하고 ORDER BY를 생략했을 경우에는 아래와 같은 결과 테이블이 만들어진다.
순서가 buyer_id 기준으로 되어 있기 때문에 뭔가 뒤죽바죽해 보인다.
HAVING
- GROUP BY 절에 의해 만들어지는 행을 제약할 때 사용된다.
- SELECT 절의 WHERE 절과 비슷한 개념이다.
- 사용 구문은 다음과 같다.
HAVING < search_condition >
- GROUP BY 절 없이 단독으로 HAVING 절을 사용할 수도 있지만, 이 때 HAVING 절은 전체 행을 하나의 그룹으로 보고, 마치 WHERE 절처럼 적용된다.
- search_condition은 WHERE 절의 검색 조건과 비슷하다. 단, SELECT 문의 열 목록에 나오는 집계식을 포함할 수 있다는 점이 WHERE 절과 다르다.
라인 3에서 buyer_id와 product_id를 기준으로 그룹화 할 때 qty의 총 합계가 250 이상인 행만 결과 집합에 포함한다.
'Study > 데이터 베이스' 카테고리의 다른 글
[DBMS 강의 - 13] 데이터 삽입 (INSERT) (0) | 2014.04.28 |
---|---|
[DBMS 강의 - 12] 집계 연산자 (0) | 2014.04.28 |
[DBMS 강의 - 10] 함수 (0) | 2014.04.27 |
[DBMS 강의 - 09] 유니온 (0) | 2014.04.22 |
[DBMS 강의 - 08] 하위 쿼리 (0) | 2014.04.22 |