🌍 Вітаю! 🇧🇾
TL;DR
- Порядок выполнения SQL: FROM → WHERE → SELECT → ORDER BY
- WHERE выполняется до SELECT, поэтому alias там ещё не существует
- Нельзя использовать alias из SELECT в условии WHERE
- Условия по агрегатам — только в HAVING
- ORDER BY выполняется после SELECT и видит alias
🌍 Вітаю! 🇧🇾
Новый год закончился, а я для вас уже написал пост ☕️.
Был не так давно на IT-квизе, и мне понравился один из вопросов.
Нам дали SQL-запрос и нужно было определить в каком порядке обрабатываются команды в этом запросе. И если честно мы с командой этот вопрос завалили , хотя он на самом деле не из разряда сложных.
Я решил разобраться что пошло не так, почему я это прошляпил при изучении БД в ВУЗе🤦♂️. Да и вообще, нужно ли это знать?
✍️ Пример:
Попробуйте определить есть ли здесь ошибка, и если да, то какая ❓
Получилось? → Держи печеньку 🍪
Не получилось? Держи ответ → 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
Новый год закончился, а я для вас уже написал пост ☕️.
Был не так давно на 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

Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.