Фотография автора

Привет, меня зовут Влад.

Здесь я пишу на темы в которых пытаюсь разобраться: веб-дизайне, программировании, веб-аналитике и рекламе.

Может о чем-то еще.

Порядок выполнения SQL запроса на сервере

Порядок выполнения запроса на сервере отличается от порядка в котором мы пишем запросы.

И чтобы было понятнее почему, например, мы в HAVING или WHERE мы не можем использовать имена выражений из SELECT, нужно посмотреть на порядок выполнения команд на сервере:

  1. FROM
  2. JOIN
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. SELECT
  7. ORDER BY

Сначала определяется таблица, из которой выбираются данные с помощью FROM, затем отбираются записи в соответствии с условием WHERE. Выбранные данные группируются с помощью GROUP BY, и из сгруппированных записей выбираются только те, которые удовлетворяют условию после HAVING. Потом уже выполняется SELECT — вычисляются выражения, присваиваются имена. И в самом конце происходит сортировка ORDER BY.

Этот порядок не соответствует синтаксическому порядку общего представления оператора SELECT, который ближе к естественному языку:

  1. SELECT
  2. FROM
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. ORDER BY

Пример:

SELECT author, SUM(price * amount) as Cost
FROM book
WHERE title <> 'Идиот' AND title <> 'Белая гвардия'
GROUP BY author
HAVING SUM(price * amount) > 5000
ORDER BY Cost DESC

Это пример из Степика, где у нас есть база данных, в которой автор, название книги, стоимость и количество книг.

В примере выше мы выбираем автора, считаем общую стоимость экземпляров книг у автора, затем указываем из какой таблицы берем данные. Указываем условие, группируем, фильтруем по стоимости экземпляров и затем сортируем.

Можно заметить, что в выражении HAVING мы использовали SUM(price * amount), а не название Cost, которое было задано в SELECT.

Всё это потому что фактически при запросе этого названия еще не будет существовать на момент выполнения HAVING. Как и было написано ранее.