Наскільки я знаю, у SQL порядок обробки логічного запиту, який є концептуальним порядком інтерпретації, починається з FROM таким чином:
- ВІД
- ДЕ
- ГРУПА ПО
- ВИДАЛЕНО
- ВИБІРИ
- СОРТУВАТИ ПО
Після цього списку легко зрозуміти, чому ви не можете мати псевдоніми SELECT у пункті WHERE, оскільки псевдонім ще не створений. 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, щоб допомогти користувачеві? Можливо, використовуючи якийсь попередній аналіз?
- Або MySQL використовує інший концептуальний порядок інтерпретації, ніж той, який я дотримувався всім RDBMS?
SELECT C, ROW_NUMBER() OVER (ORDER BY X) AS RN FROM T GROUP BY C HAVING RN = 1
буде проблематично , як ROW_NUMBER
біжить післяHAVING
SELECT @rownum:=@rownum + 1 as row ...
. Може бути, причина, чому вони підтримують псевдоніми SELECT, просто в тому, що вони можуть через те, що вони не підтримують речі, які б унеможливили ... :)
HAVING
та SELECT
пункт можуть бути змінені. Отже, в цьому немає ніякої неоднозначності і може спростити вигляд коду, коли в ньому є жахливі вирази SELECT
.