mysql의 WHERE 절에 별칭을 사용할 수 있습니까?


121

WHERE 절에 별칭을 사용해야하지만 알 수없는 열이라는 메시지가 계속 표시됩니다. 이 문제를 해결할 수있는 방법이 있습니까? 등급이 x보다 높은 레코드를 선택해야합니다. 등급은 다음 별칭으로 계산됩니다.

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating

답변:


229

예를 들어 별칭을 볼 있는 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,“열 별칭 문제”를 참조하십시오 .


1
내가 표현을 반복하면, 저에게 말한다 : "그룹 기능의 사용이 잘못되었습니다"

3
허용되지 않는 집계 함수를 더 명확하게하기 위해 단어를 변경했습니다
Paul Dixon

좋은 설명, 특히. "하지만 where 절에서 ... 반복 .."부분
th3an0maly

4
이것은 좋은 대답이지만 HAVING데이터를 가져온 후 WHERE실행하고 이전에 실행 하므로 성능에 미치는 영향을 고려하십시오 .
StockB

WHERE 절에서는 집계 함수를 사용할 수 없습니다. WHERE 절은 전체 그룹이 아니라 한 번에 하나씩 행만 필터링합니다.
Bill Karwin

33

이것이 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 ...

6

이 질문은 꽤 오래되었고 한 답변은 이미 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


0

쿼리가 정적 인 경우 뷰로 정의 할 수 있으며 뷰를 쿼리하는 동안 where 절에서 해당 별칭을 사용할 수 있습니다.


0
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.