2013-04-14 5 views
1

WHERESELECT 열 목록보다 먼저 평가됩니다. 다음과 같은 결과 : WHERE 절에서 열 별칭 사용

SELECT l_n AS last_name FROM contacts WHERE last_name > 'J';

이 작동하지 않을 수 있습니다.
다음은 작동합니다

SELECT * FROM (SELECT l_n AS last_name FROM contacts) tmp WHERE last_name > 'J';

내 질문은 :이 또한 하위 쿼리로 분류되어 있습니까? 그렇다면 하위 쿼리를 사용하지 않으려는 경우이 대안이 있습니까?

+1

HAVING 키워드를 체크 아웃 – sashkello

+0

@sashkello : 잘 HAVING했다! – Cratylus

+3

GROUP BY, ORDER BY 또는 HAVING 절에서만 열 별칭을 사용할 수 있습니다. – Damith

답변

-1

예, 여기에 ...

SELECT l_n AS last_name FROM contacts HAVING last_name > 'J'; 

하십시오 내 쿼리 모든 결과 (전체 검사)를 가지고 다음 HAVING 절에 기준으로 필터링 야한다.

성능에 대한 우려가있는 경우 하위 쿼리를 사용해야합니다. 또는 오히려 :

SELECT l_n AS last_name FROM contacts HAVING l_n > 'J'; 

[편집]

이봐 친구가, 그래 그것을 더 집계 함수와 함께 작동합니다. 여기에 예제가 있습니다 :

mysql> select * from blah; 
+----+---------+ 
| id | name | 
+----+---------+ 
| 1 | renato | 
| 2 | rodrigo | 
+----+---------+ 
2 rows in set (0.00 sec) 


mysql> select id as a1, name as a2 from blah having a1 > 1; 
+----+---------+ 
| a1 | a2  | 
+----+---------+ 
| 2 | rodrigo | 
+----+---------+ 
1 row in set (0.00 sec) 

내 데이터베이스는 5.5.29-0ubuntu0.12.04.2입니다.

+0

나는이 '집계 함수 또는 GROUP BY 절에 포함되어 있지 않기 때문에'[열] HAVING 절에 유효하지 않습니다. ', 당신은 집계 함수없이 HAVING 사용할 수 있는지? –

3

"이 또한 하위 쿼리로 분류되어 있습니까?"라는 질문에 대답은 '예'입니다. 하위 쿼리를 피하는 질문에 가장 쉬운 방법은 쿼리의 where 절에서 실제 열 이름을 사용하는 것입니다.

관련 문제