kit_de
@kit_de
Моя... Твоя... Привет!

Почему в HAVING работают псевдонимы из SELECT?

Читал, что псевдонимы столбцов нельзя использовать в предложении WHERE, поскольку запрос обрабатывается по схеме:
  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

Таким образом, на момент обработки WHERE, определенные в SELECT псевдонимы еще не назначены.
И действительно, запрос...
SELECT model AS PcModel FROM PC
WHERE PcModel > 22
...выдает ошибку "Lookup Error - MySQL Database Error: Unknown column 'PcModel' in 'where clause"
-------------------------------------
Суть вопроса:
Следуя озвученной логике, я предположил, что псевдонимы в HAVING должны тоже генерить эту ошибку, однако запрос...
SELECT model, MAX(price) AS PcPrice FROM PC
GROUP BY model
HAVING PcPrice > 800;
... спокойненько работает.
Объясните пожалуйста, почему так? Ведь должна же быть ошибка, поскольку HAVING отрабатывается раньше SELECT.
  • Вопрос задан
  • 899 просмотров
Пригласить эксперта
Ответы на вопрос 2
index0h
@index0h
PHP, Golang. https://github.com/index0h
HAVING предназначен для пост фильтрации данных, а не для первичной. Одна из основных причин почему он пишется после GROUP BY. За счет GROUP BY у вас появляются вычисляемые поля по функциям GROUP_CONCAT, MAX, MIN, SUM,... Фильтрацию по этим вычисляемым полям и выполняет HAVING.
Ответ написан
Комментировать
@Sumor
HAVING накладывает условия на уже выполненный и отобранный запрос, в котором уже есть псевдонимы, а всё остальное работает перед окончательной выдачей, где псевдонимов ещё нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы