Ответ
Логический порядок выполнения SQL-запроса (порядок обработки движком) отличается от порядка его написания. Вот последовательность:
- FROM (и JOIN) — сначала определяется исходный набор данных из таблиц и выполняются все соединения.
- WHERE — затем происходит фильтрация строк по заданным условиям.
- GROUP BY — строки группируются (если указано).
- HAVING — фильтруются уже сформированные группы (если указано).
- SELECT — выбираются, вычисляются и переименовываются столбцы, включая агрегатные функции.
- ORDER BY — результат сортируется.
- LIMIT / OFFSET — применяется ограничение на количество возвращаемых строк.
Почему это важно? Например, вы не можете использовать псевдоним столбца из SELECT в условии WHERE, потому что WHERE выполняется раньше, чем SELECT. Алиасы из SELECT доступны только в ORDER BY и HAVING.
Пример, иллюстрирующий порядок:
-- Порядок НАПИСАНИЯ
SELECT
d.name AS department, -- 5. Выбор и переименование
COUNT(e.id) AS emp_count -- 5. Агрегация
FROM employees e -- 1. Определение таблицы
JOIN departments d ON e.dept_id = d.id -- 1. Соединение
WHERE e.salary > 50000 -- 2. Фильтрация строк
GROUP BY d.name -- 3. Группировка
HAVING COUNT(e.id) > 5 -- 4. Фильтрация групп
ORDER BY emp_count DESC -- 6. Сортировка
LIMIT 10; -- 7. Ограничение вывода