본문 바로가기

Study/데이터 베이스

[DBMS 강의 - 11] GROUP BY / HAVING

때로는 데이터를 그룹화해서 값을 집계할 필요가 있는 경우가 많다. 예를 들면 모 회사의 시도별(서울시,세종시,강원도,충청도 등) 대리점들의 매출합산을 구하는 경우이다.

위와 같은 데이터를 조회할때는 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