GROUP BY

DB/MySQL 2010. 6. 29. 13:37

GROUP BY 절은 내가 하고 있는 업무에서 자주 쓰게 되는
문법이다.
제대로 쓰려면, 조금씩 연구를 해야하는 법!

지금부터 GROUP BY에 대해 알아보자.

그리고,
GROUP BY 와 함께 사용하는
HAVING은 무엇이고, 어떠한 시점으로 작동하는 지 살펴보도록 하자.


**** [ SAMPLE CODE ] *****************************************

mysql> select * from A
+------+--------+--------+
| id   | value1 | value2 |
+------+--------+--------+
|    1 |     10 | kkk    |
|    2 |     30 | mmm    |
|    3 |     20 | hhh    |
|    4 |     10 | jjj    |
|    5 |     30 | kkk    |
|    6 |     10 | kkk    |
+------+--------+--------+
6 rows in set (0.00 sec)

설명을 위해 임시로 테이블 a를 생성하여,
GROUP BY 값을 볼 수 있도록,
중복된 값을 넣어보았다.

======================================================

mysql> SELECT *
    -> FROM A a
    -> GROUP BY a.value1, a.value2;
+------+--------+--------+
| id   | value1 | value2 |
+------+--------+--------+
|    4 |     10 | jjj    |
|    1 |     10 | kkk    |
|    3 |     20 | hhh    |
|    5 |     30 | kkk    |
|    2 |     30 | mmm    |
+------+--------+--------+
5 rows in set (0.00 sec)

단순히 HAVING절의 삽입없이,
GROUP BY를 사용한 경우이다.
이 예에서 볼 수 있듯이,
GROUP BY는 내부적인 정렬(sorting)이 이루어지며,
중복된 값을 배제한다.

======================================================


mysql> SELECT *
    -> FROM A a
    -> GROUP BY a.value1, a.value2
    -> HAVING count(*) > 1
    -> ;
+------+--------+--------+
| id   | value1 | value2 |
+------+--------+--------+
|    1 |     10 | kkk    |
+------+--------+--------+
1 row in set (0.01 sec)

HAVING은 GROUP BY에 부여하는 조건을 명시한다.


위의 예는 HAVING을 사용하여 중복된 ROW를 찾는 예이다.

그런데 여기서 의문점이 제기된다. 
'도대체 HAVING이 적용되는 시점은 언제일까?'

테이블 A에서 count(*)>1 인 녀석을 먼저 찾고 GROUP BY가 적용될까?
아니면, GROUP BY를 먼저 적용하고 난 결과물 중 count(*)>1 인 녀석을 찾는 것일까?

단순히 위의 결과로만 본다면, 어느 것이 먼저 적용되는 지 알기 힘들다.

****************************************************************

골머리 싸잡고 혼자 고민하다,
결국 내가 아는 고수분의 도움을 얻어,
내부적으로 발생하는 순서를 알아내었다.

**** [ HAVING의 타이밍 ] *****************************************

+------+--------+--------+
value1           | value2    |  row_number 
━┳━ 
10  ━┳━ jjj ━┳━━ 4     
   ┃            ┃
   ┃            ┗━ 
kkk  ┳━━ 
1
   ┃                         ┃
   ┃                         ┗━━ 
6
   ┃
   ┣━ 
20  ━━━ hhh ━━━ 
3
   ┃
   ┃
   ┗━ 
30  ━┳━ kkk   ━━━ 
5
                  ┃
                  ┗━ 
mmm ━━━ 2

(젠장 그리기 빡세네 --;;)
GROUP BY 가 value1, value2  순서로 수행되면,
위와 같은 트리가 만들어진다.

그렇다면? 
눈치 빠른 사람은 이미 알아챘겠지만,
HAVING의 타이밍이 이것에 달려 있다는 것이다.

즉,
트리의 LEAF(위 그림중 row_number라고 되어 있는 영역) 영역이
HAVING이 계산되는 시점이다.
각각의 분류가 완료되고 난 후,
각 카테고리 별로 HAVING의 조건이 검색된다.


자, 그럼 이제부터는 어느 시점에서 조건이 발효되는 지 
알테니,
잘 써먹도록 하자. (^0^)/
******************************

출처 -  http://blog.naver.com/nadarim?Redirect=Log&logNo=70047337113

'DB > MySQL' 카테고리의 다른 글

LIKE, BETWEEN, IN  (0) 2010.07.08
[MySql] JOIN 문  (0) 2010.07.02
group by, having, inner join  (0) 2010.06.28
에러 코드 모음  (0) 2010.06.17
mysql 접속 여부 확인 및 에러  (0) 2010.05.31
: