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의 조건이 검색된다.
'개발 > 데이타베이스' 카테고리의 다른 글
order by case (0) | 2017.02.21 |
---|---|
group by 내부정렬 (0) | 2017.02.21 |
LISTAGG ... WITHIN ... ROWNUM 적용하고 싶을 때 .. (0) | 2017.02.09 |
[ORACLE] ROLLUP, CUBE, GROUPING (0) | 2017.02.06 |
[ORACLE] RANK OVER() / ROW_NUMBER() OVER() (0) | 2017.02.06 |
댓글