Какой полный базовый синтаксис оператора SELECT в SQL?

«Какой полный базовый синтаксис оператора SELECT в SQL?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Полная структура оператора 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

Логический порядок выполнения (не порядок написания):

  1. FROM / JOIN — определяет исходные таблицы.
  2. WHERE — фильтрует строки на уровне записей.
  3. GROUP BY — агрегирует строки в группы.
  4. HAVING — фильтрует сгруппированные данные.
  5. SELECT — вычисляет выражения и выбирает столбцы.
  6. DISTINCT — удаляет дубликаты.
  7. ORDER BY — сортирует результат.
  8. 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;