Из каких ключевых частей состоит SQL-запрос SELECT?

Ответ

SQL-запрос SELECT состоит из нескольких необязательных предложений, которые выполняются в строгом порядке:

  1. SELECT — определяет столбцы или вычисляемые выражения для вывода.
  2. FROM — указывает таблицу или таблицы, из которых извлекаются данные.
  3. WHERE — фильтрует строки перед группировкой.
  4. GROUP BY — группирует строки по значениям указанных столбцов.
  5. HAVING — фильтрует группы после группировки (аналог WHERE для групп).
  6. ORDER BY — сортирует результирующий набор.
  7. LIMIT / OFFSET (или FETCH FIRST / OFFSET в стандарте SQL) — ограничивает количество возвращаемых строк.

Порядок выполнения (логический): FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT.

Пример запроса, использующего все части:

SELECT department, COUNT(*) as employee_count
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY department
HAVING COUNT(*) > 5
ORDER BY employee_count DESC
LIMIT 10;

Ответ 18+ 🔞

Давай разберём эту SQL-хуйню, как будто я тебе на кухне объясняю, пока чайник закипает.

Представь, что ты начальник склада, а база данных — это твой склад, забитый дохуя коробками. Запрос SELECT — это твоя команда грузчикам, что и как тащить. И команда эта состоит из кусков, которые выполняются в жёстком порядке, как в армии. Не перепутай, а то получишь пизды вместо данных.

Смотри, вот они, эти куски, по порядку, как их машина выполняет, а не как ты пишешь:

  1. FROM — это первое. Ты говоришь: «Ребята, идите нахуй в такой-то склад (таблицу employees)». Без этого шага нихуя не начнётся.
  2. WHERE — фильтрация на месте. «Тащите только те коробки, которые приехали после 1 января 2020-го (hire_date > '2020-01-01')». Старые шнягу — нахуй.
  3. GROUP BY — группировка. «А теперь свалите всё, что нашли, в кучки по отделам (department). В одну кучку — отдел маркетинга, в другую — бухгалтерии».
  4. HAVING — фильтрация уже этих кучек. «Эти кучки посчитайте. И если в кучке меньше пяти коробок (COUNT(*) > 5) — выкидывайте нахуй всю кучку. Нам только крупные партии».
  5. SELECT — выборка полей. Только СЕЙЧАС, после всех фильтраций и группировок, ты говоришь: «Окей, из оставшихся кучек мне нужны только две бумажки: название отдела и количество коробок в нём (department, COUNT(*) as employee_count)».
  6. ORDER BY — сортировка. «А теперь разложите эти бумажки по порядку: у кого коробок больше — тот сверху (ORDER BY employee_count DESC)».
  7. LIMIT — ограничение. «И дайте мне только топ-10 (LIMIT 10), на остальное уже похуй, устал смотреть».

Вот и весь сказ. Если попробуешь в WHERE сослаться на employee_count (который создаётся в SELECT), то получишь ошибку, потому что WHERE работает ДО SELECT, и этой хуйни для него ещё не существует. Для фильтрации результатов агрегации (COUNT, SUM) используй HAVING.

SELECT department, COUNT(*) as employee_count
FROM employees
WHERE hire_date > '2020-01-01' -- WHERE не видит employee_count!
GROUP BY department
HAVING COUNT(*) > 5 -- HAVING видит результат COUNT(*)
ORDER BY employee_count DESC -- ORDER BY уже видит псевдоним employee_count
LIMIT 10;

Запомни эту цепочку: FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT. Это как алгоритм приготовления пельменей: сначала достаёшь из морозилки (FROM), потом отбираешь целые (WHERE), потом сортируешь по видам (GROUP BY), потом отбрасываешь виды, где мало штук (HAVING), потом кладёшь на тарелку (SELECT), потом красиво раскладываешь (ORDER BY), и, наконец, накладываешь себе в миску только 10 штук (LIMIT), а остальное — жадности ебать.