Introduction

이번에는 데이터를 그룹화 하는 것을 배운다. 같은 종류로 평가되는 데이터를 하나의 그룹으로 묶을 수 있다. 이러한 그룹을 집계를 할 수 있다. 그룹화와 집계, 이 둘을 "모으다" 개념 안경을 끼고 본다면, 테이블 테이터를 묶어 가공한다는 이야기이다. 그러므로 이번 10장은 이러한 데이터 묶음에 대해서 배운다.

Content

1. 무엇을 데이터 그룹화 라고 하는가?

그룹화 한다는 말은 "끼리끼리 모아 틀에 놓는 것"을 의미한다. SQL, DB 세계에서 그룹화란 끼리끼리 모아 놓는것을 집계하는 것을 의미한다. 그래서 9장에서 집계 함수에 대해서 공부한 것이다.

2. 왜 데이터 그룹화 하는가?

삼성, LG 에서 생산해 내는 품목은 몇개인가? 10 종류 품목을 생산하는 업체는 어디인가? 를 찾을 때 사용 한다. 즉, 회사와 품목을 그룹화 시키면, 회사당 품목 갯수를 알 수 있다. 그러므로 그룹으로 묶은 것을 집계 할 필요가 있을 때, 데이터 그룹화를 한다.

3. 어떻게 데이터를 그룹화 시키는가?

SELECT 절에 GROUP BY 절을 결합시키면 되는데, 어떻게 결합시키고 무엇을 GROUP BY 절에 넣어야 하는지 알아보자. 결합은 FROM 절 뒤, ORDER BY 절 앞에 둘 수 있다. 곰곰히 생각해 보면, 무엇을 어디서 어떻게, 가저 올지 결정해야 하므로, 어떻게 부분에 넣을 수 있다. 참고로 SQL에 있는 SELECT는 무엇을 --> 어디서 --> 어떻게 식으로 문장을 구성 시킨다.

무엇을 그룹화 시킬지 결정하기 위해선 GROUP BY 절 뒤에 칼럼(열)이름을 입력하면 된다. 여러개를 입력 할 수 있고, 이때 이 의미는 그룹속에 그룹화를 시키겠다는 뜻이다. 이게 프랙탈 구조로 계속 이어진다.


두개의 SQL절은 동일한 결과를 내는데, GROUP BY를 실제로 이렇게 쓰지는 않는다. GROUP BY 는 위에서 언급했듯이 그룹 당 집계를 할 때 사용 한다. 결과는 다음과 같다.


GROUP BY 절 규칙

  1. 각 열의 정보를 가져 올 수 없다. 항상 집계된 정보만 가져 올 수 있다.
  2. 중첩된 그룹을 사용할 경우, 그룹속에 구릅을 정의 하는 것이며, 마지막에 입력된 칼럼(열)이 기준이 된다.
  3. SELECT 절로 선택한 열은 집계 함수로 만든 열이거나 그룹 시킬 열만 올 수 있다.

4. WHERE + GROUP BY 는 어떤 의미이며, 어떻게 사용 되는가?

WHERE 은 전체 레코드에서 필터링을 하는 것을 의미하고, GROUP BY는 그룹화 하는 것을 의미한다. 즉, 전체 레코드를 필터링 하고 그룹화 하라는 의미이다.


이 의미는 vend_id와 product를 Products에서 prod_price > 10 조건에 맞는 레코드를 vend_id로 그룹화 하라는 의미이다.

이렇게 전체 대상을 필터링 하여 그룹화를 시킬 수 있는데, 그룹화 순서를 바꾸어서, 그룹화를 만저한 후에 그룹화된 결과를 필터링 하는 방법은 없을까? 있다. 그것이 바로 HAVING 절이다.

5. GROUP BY + HAVING

HAVING 은 WHERE 에서 사용 되는 모든 연산자를 지원한다. > = < 등등, 중요한 것은 그룹화된 결과만 HAVING 으로 필터링 할 수 있으며, 위치는 GROUP BY 뒤에 HAVING 을 놓아야 한다. 그래야 HAVING 이 그룹화 한 후에 결과를 필터링 할 수 있다.

여기서 WHERE과 HAVING을 구별 못할 수 있는데, 차이점을 다시 정리하면, WHERE은 전체 레코드를 필터링 할 때 사용 하며, HAVING은 그룹화된 레코드를 필터링 할 때 사용 한다. 그러므로 혼동하지 말아야 할 것이다.

6. GROUP BY + ORDER BY

그룹화 된 레코드들은 정렬되어서 나오는것이 아니므로, 정렬이 필요할 땐 ORDER BY를 사용 해야 한다. 정렬이라는 것은 정렬될 대상이 있어야만 가능하다. 그러므로 ORDER BY 절은 모든 대상을 다 고른 다음 제일 뒤에 ORDER BY 를 놓어야 한다.


마지막으로, 설명이 부실한 편이 많은데, 이것은 관련 링크로 대체 하는게 좋을것 같다.

관련링크

  1. http://sql.1keydata.com/kr/sql-group-by.php
  2. http://flashcafe.org/4387
  3. http://www.w3schools.com/sql/sql_groupby.asp
  4. http://www.daniweb.com/forums/thread32342.html

Digression

누구나 안경을 끼고 사물을 봐야 한다고 생각한다. 그래야 여러 안경을 끼고 사물을 볼 수 있기 때문이다. 여기서 말하는 안경이 편견이 될 수 있어도, 이것을 받아드려야 한다. 그리고 이 편견이 변한다는 것 까지 받아 드려야 한다. 이는 좋은 안경을 만드는 기술이 되기 때문이다.  뭐~ 개인적인 생각이지만 : )

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요