답변:
예를 들어 별칭을 볼 수 있는 HAVING 절을 사용할 수 있습니다.
HAVING avg_rating>5
하지만 where 절에서는 식을 반복해야합니다. 예 :
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
그러나! 모든 표현식이 허용되는 것은 아닙니다. SUM과 같은 집계 함수를 사용하면 작동하지 않습니다.이 경우 HAVING 절을 사용해야합니다.
로부터 MySQL의 매뉴얼 :
WHERE 절이 실행될 때 열 값이 아직 결정되지 않았을 수 있기 때문에 WHERE 절에서 열 별칭을 참조 할 수 없습니다. 섹션 B.1.5.4,“열 별칭 문제”를 참조하십시오 .
HAVING
데이터를 가져온 후 WHERE
실행하고 이전에 실행 하므로 성능에 미치는 영향을 고려하십시오 .
이것이 mysql에서 작동하지만 sqlserver를 사용하면 다음과 같이 래핑 할 수도 있습니다.
select * from (
-- your original query
select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
from ...) Foo
where Foo.avg_rating ...
이 질문은 꽤 오래되었고 한 답변은 이미 160 표를 얻었습니다 ...
그래도 나는 이것을 분명히 할 것이다. 질문은 사실 별칭 이름이 절 에서 사용될 수 있는지에 관한 것이 아니다WHERE
.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
집계입니다. 에서 WHERE
절 우리는 그 값을 보면 테이블에서 우리가 원하는 기록을 제한합니다. sum(reviews.rev_rating)
그리고 count(reviews.rev_id)
, 그러나, 우리는 기록에서 찾을 값되지 않습니다 그들은 레코드를 집계 한 후에 만 얻는 값입니다.
그래서 WHERE
부적절합니다. HAVING
집계 후 결과 행을 제한 하려면이 필요합니다 . 그것은 될 수 없습니다
WHERE avg_rating > 10
...도 아니다
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
그 후.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
반면에 가능하며 SQL 표준을 준수합니다. 이므로
HAVING avg_rating > 10
MySQL에서만 가능합니다. 이 SELECT
절은 이후에 실행되어야 하므로 표준에 따라 유효한 SQL이 아닙니다 HAVING
. MySQL 문서에서 :
표준 SQL에 대한 또 다른 MySQL 확장은 선택 목록에서 별칭이 지정된 식에 대한 HAVING 절의 참조를 허용합니다.
MySQL 확장은 집계 된 열의 HAVING 절에서 별칭 사용을 허용합니다.
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html