2011-09-16 2 views
5

일부 테이블의 조인을 기반으로보기 (viewX)가 있습니다.MySQL Query에서 HAVING과 WHERE의 차이점은 무엇입니까?

WHERE을 사용할 때 쿼리가 지연되고 프로세서 사용량이 50 %로 이동하고 마지막으로 mysqld.exe 서비스를 닫고 해당 문제를 해결하기 위해 다시 시작해야합니다. 다시 문제.

HAVING를 사용하면 쿼리가 완벽하고 신속하게 실행되어 결과를 얻고 모든 준비가 완료됩니다.

쿼리는 다음과 유사합니다.

SELECT * FROM viewX WHERE column_of_view = 'foo' 

SELECT * FROM viewX HAVING column_of_view = 'foo' 

현재 무슨 일입니까?

내가 찾은 해결책은 다음과 같이하는 것입니다.

SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo' 

SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo' 

두 가지 질문이 모두 효과가 있지만 좋지 않습니다. (SELECT * FROM (... viewX) ????)

+0

일부 실행 계획을 게시 할 수 있습니까? – Thilo

+0

최선의 추측은 HAVING을 사용하면 나와 같은 혼동을 불러 일으키는 것과 마찬가지로 쿼리 최적화 프로그램을 혼란스럽게 만들고 다른 혼동 순서 (다른 조인 순서 및 방법)가 발생한다는 것입니다.이 경우 실제로 이점이 있습니다. 많은 조인, 차선 조인 순서의 잠재 성은 엄청납니다). 첫 번째 몇 개의 행을 더 빨리 반환 할 것인가, 아니면 전체 행을 전체적으로 더 빨리 선택합니까? – Thilo

+0

둘 다 지정하면 어떻게됩니까? – Thilo

답변

5

WHERE은 조건에 따라 쿼리 결과를 필터링합니다.

HAVING은 집계 함수의 결과에 필터를 적용하기위한 것입니다. 집계 함수가 없으면 WHERE와 동일하게 기능합니다.

http://blog.sqlauthority.com/2007/07/04/sql-server-definition-comparison-and-difference-between-having-and-where-clause/

+1

맞지만 무슨 일이 일어나는지 설명하지는 않습니다. 사실 그것은 차이가 없어야한다고 주장한다. – Thilo

0

그것은 뷰의 정의에 따라 달라집니다 - 절을 가진 만 집계 쿼리에 적용해야 그 그룹화 한 후 적용했다. 두 개의 쿼리 계획 (설명 포함)을 살펴 보았습니까?

0
목록 및 별명 이름은 아직 ALIAS 이름은 인라인 행을 필터링하면서

에 문제가있을 수 있어야 생성되도록 가능한 모든 행을 나열 후 필터 행을 HAVING

를 사용할 수없는 동안 사용

.

1

sum, avg 등과 같은 집계 함수에 사용되며 select 문에서만 사용할 수 있습니다. 절은 집계 조건 에서 작동하지 않습니다. where sum (mark)> 300 // not true

관련 문제