SQL에서 내가 아는 한 개념적 해석 순서 인 논리적 쿼리 처리 순서는 다음과 같은 방식으로 FROM으로 시작합니다.
- 에서
- 어디
- GROUP BY
- HAVING
- 고르다
- 주문
이 목록을 따르면 별칭이 아직 생성되지 않았기 때문에 WHERE 절에 SELECT 별칭을 사용할 수없는 이유를 쉽게 알 수 있습니다. T-SQL (SQL Server)은이를 엄격하게 따르며 SELECT를 전달할 때까지 SELECT 별칭을 사용할 수 없습니다.
그러나 MySQL에서는 (논리적으로) SELECT 절보다 먼저 처리해야하더라도 HAVING 절에서 SELECT 별칭을 사용할 수 있습니다. 이것이 어떻게 가능합니까?
예를 들자면 :
SELECT YEAR(orderdate), COUNT(*) as Amount
FROM Sales.Orders
GROUP BY YEAR(orderdate)
HAVING Amount>1;
T-SQL에서 명령문이 유효하지 않습니다 (HAVING이 SELECT 별명을 참조하므로 Amount
).
Msg 207, Level 16, State 1, Line 5
Invalid column name 'Amount'.
...하지만 MySQL에서는 잘 작동합니다.
이를 바탕으로 궁금합니다.
- MySQL은 사용자를 돕기 위해 SQL 규칙에서 바로 가기를 사용합니까? 아마도 어떤 종류의 사전 분석을 사용합니까?
- 아니면 모든 RDBMS가 따르고 있지만 MySQL과 다른 개념적 해석 순서를 사용하고 있습니까?
SELECT C, ROW_NUMBER() OVER (ORDER BY X) AS RN FROM T GROUP BY C HAVING RN = 1
은 AS 문제가 될 것입니다 ROW_NUMBER
실행 후HAVING
SELECT @rownum:=@rownum + 1 as row ...
. 어쩌면 그들이 선택 별칭을 지원하는 이유는 그것이 불가능하게 만드는 것들을 지원하지 않기 때문에 가능할 수 있기 때문일 것입니다. :)
HAVING
와 SELECT
절을 서로 바꿀 수 있습니다. 따라서이 작업을 수행하는 데 모호성이 없으며에 이상한 괴물이있을 때 코드 모양을 단순화 할 수 있습니다 SELECT
.