음머어's 까망별

블로그 이미지
무지 인간의 첫 걸음..
by 까망별 음머어
  • 283,229Total hit
  • 24Today hit
  • 55Yesterday hit

'GROUP BY'에 해당되는 글 1건

  1. 2008.06.09
    [MySQL] GROUP BY 에서 HAVING의 시점 (3)

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^)/
****************************************************************

** 잡담
휴~~ 내용은 얼마 안 되는데,
그림 그리느라 오래 걸렸넹..

뭐.. 안 까먹으려면, 이렇게라도 해야징....
요즘 내머리도 2mb 급으로 떨어진겐가 ㅠ,.ㅠ

저작자 표시 비영리
신고
TRACKBACK 0 AND COMMENT 3

ARTICLE CATEGORY

모든 이야기 (77)
독백 (22)
MySQL (25)
Oracle (7)
영화 (6)
Linux (3)
DW(Data Warehouse) (0)
(7)
음악 (1)
Python (3)
Postgresql (2)

ARCHIVE