Ответ
Полная структура оператора SELECT (в порядке выполнения):
SELECT [DISTINCT | ALL]
{ * | expression [[AS] alias], ... }
FROM
table_name [[AS] alias]
[ { INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] } JOIN
another_table ON join_condition ]
[WHERE
condition]
[GROUP BY
column1, column2, ...]
[HAVING
condition_after_grouping]
[ORDER BY
column1 [ASC | DESC], ...]
[OFFSET
n {ROW | ROWS}]
[FETCH {FIRST | NEXT} m {ROW | ROWS} ONLY];
-- или [LIMIT m [OFFSET n]] для MySQL/PostgreSQL
Логический порядок выполнения (не порядок написания):
FROM/JOIN— определяет исходные таблицы.WHERE— фильтрует строки на уровне записей.GROUP BY— агрегирует строки в группы.HAVING— фильтрует сгруппированные данные.SELECT— вычисляет выражения и выбирает столбцы.DISTINCT— удаляет дубликаты.ORDER BY— сортирует результат.OFFSET/FETCH(LIMIT) — ограничивает вывод.
Пример комплексного запроса:
SELECT
d.name AS department,
COUNT(e.id) AS employee_count,
AVG(e.salary) AS avg_salary
FROM
departments d
LEFT JOIN employees e ON d.id = e.department_id
WHERE
e.hire_date > '2020-01-01'
GROUP BY
d.id, d.name
HAVING
COUNT(e.id) > 5
ORDER BY
avg_salary DESC
OFFSET 0 ROWS
FETCH FIRST 10 ROWS ONLY;