2010-11-27 4 views

답변

3

HAVING이 요약 행상에서 동작 (WHERE 대신에 HAVING 절에 별명을 넣어). (GROUP BY을 제외하면 HAVINGGROUP BY과 함께 사용하기 위해 예약 된 절이므로 GROUP BY을 생략해도 배후에서 암시 적으로 발생하는 동작은 변경되지 않습니다.

이 때문에 WHERE은 색인을 사용할 수 있지만 HAVING은 색인을 사용할 수 없습니다. (매우 단순한 그룹화되지 않은 결과 집합에서는 이론적으로 HAVING에 대한 인덱스를 사용할 수 있지만 쿼리 최적화 프로그램이 실제로 이런 식으로 구현 된 것을 본 적이 없습니다.)

+0

하지만 내가 연결 한 대답은 GROUP BY를 전혀 포함하지 않습니다 ... – ripper234

+2

@ ripper234 : 해당 쿼리와 GROUP BY 쿼리에 대한 쿼리 분석기를 보면 이상하게 동일하다는 것을 알 수 있습니다 (실제 표현 값을로드하는 것을 제외하고) HAVING 절을 적용하기 위해 결과 집합의 모든 요소에 대해 GROUP BY - O (n) 반복의 "페널티"를 지불해야합니다. –

+1

@ ripper234 : GROUP BY 연산자에 대한 MySQL 확장이며 GROUP BY를 집계되지 않은 열의 하위 집합과 함께 사용하는 것과 같습니다. http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html –

2

MySQL은 WHERE 절까지 쿼리를 평가 한 다음 HAVING 절로 필터링합니다. 그렇기 때문에 HAVING은 열 별칭을 인식 할 수 있지만 WHERE은 인식 할 수 없습니다.

GROUP BY 절을 생략하면 검색 결과를 그룹화하지 말라는 의미입니다.

+1

의미 론적 차이점이 아닙니다. 또는 적어도, 나는이 의미를 이해하지 못한다.) 구현 세부 사항처럼 들립니다. – ripper234

1

매우 광범위하게는 WHERE이 쿼리 (DB 테이블)로 들어가는 데이터를 필터링하는 반면 HAVING은 쿼리 출력을 필터링합니다.

WHERE 절의 문은 테이블 (및 기타 외부 데이터 원본) 만 참조 할 수 있으며 HAVING 절의 문은 쿼리에서 생성 한 데이터를 참조 할 수 있습니다.

관련 문제