Пейджер

🌍 Вітаю! 🇧🇾

TL;DR
  • Порядок выполнения SQL: FROM → WHERE → SELECT → ORDER BY
  • WHERE выполняется до SELECT, поэтому alias там ещё не существует
  • Нельзя использовать alias из SELECT в условии WHERE
  • Условия по агрегатам — только в HAVING
  • ORDER BY выполняется после SELECT и видит alias
🌍 Вітаю! 🇧🇾

Новый год закончился, а я для вас уже написал пост ☕️.

Был не так давно на IT-квизе, и мне понравился один из вопросов.
Нам дали SQL-запрос и нужно было определить в каком порядке обрабатываются команды в этом запросе. И если честно мы с командой этот вопрос завалили , хотя он на самом деле не из разряда сложных.

Я решил разобраться что пошло не так, почему я это прошляпил при изучении БД в ВУЗе🤦‍♂️. Да и вообще, нужно ли это знать?

✍️ Пример:

SELECT price * 0.6 AS discount
FROM products
WHERE discount > 1000;


Попробуйте определить есть ли здесь ошибка, и если да, то какая

Получилось? → Держи печеньку 🍪
Не получилось? Держи ответ → Details: column "discount" does not exist
Даже если вы определили ошибку, думаю вам будет полезно прочитать пост до конца:

Почему же мы получили такую ошибку? Дело в том, что SQL это декларативный язык, что означает, что порядок выполнения команд может отличаться от порядка их написания, мы описываем, что мы хотим получить, а движок сам определяет наилучший способ достижения этой цели.

Вот такой порядок выполнения команд я нашел в ваших интернетах 👨‍💻:

FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT(DISTINCT) → ORDER BY → LIMIT/OFFSET

Таким образом, давайте подумаем, почему в примере выше мы получили ошибку.

1️⃣ Сначала выполняется: FROM products
2️⃣ Потом WHERE discount > 1000
3️⃣ И только потом SELECT price * 0.6 AS discount

🤕 на этапе WHERE никакого discount ещё не существует, alias появляется только на этапе SELECT, а WHERE к этому моменту уже отработал.

🙌 Коротенько, особенности которые неплохо было бы знать:

🟠Нельзя использовать alias, объявленные в SELECT, в конструкции WHERE

🟠Условия по неагрегированным данным нужно размещать в WHERE, а условия по агрегатам — в HAVING

🟠В отличие от WHERE, сортировка ORDER BY выполняется после SELECT. Поэтому alias, объявленные в SELECT, уже существуют и их можно использовать для сортировки.

🟠Применяйте фильтры в предложении WHERE, чтобы уменьшить количество строк, обрабатываемых на более поздних этапах, таких как группировка или сортировка.

🟠Предварительная агрегация может уменьшить объём данных для JOIN. Оптимизатор скорее всего сделает это сам, но явное разделение шагов иногда даёт более читаемый и предсказуемый результат.

💬 Делитесь своим мнением в комментариях👇! Если вам понравился пост, не забудьте поставить лайк! 👍

#SQL
Медиа 1
Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.
Подписаться на @ivanchikovitclub Открыть пост в Telegram