В каких секциях SQL-запроса можно использовать агрегатные функции и для каких целей?

Ответ

Агрегатные функции (такие как COUNT, SUM, AVG, MAX, MIN) используются для выполнения вычислений над набором строк и возвращения одного итогового значения. Их можно применять в следующих секциях SQL-запроса:

  1. SELECT

    • Цель: Для вычисления итоговых значений по столбцам. Обычно используется вместе с GROUP BY.
      -- Подсчет средней зарплаты в каждом департаменте
      SELECT department, AVG(salary) as average_salary
      FROM employees
      GROUP BY department;
  2. HAVING

    • Цель: Для фильтрации групп строк после их агрегации. HAVING работает с результатами агрегатных функций, в отличие от WHERE, который фильтрует строки до агрегации.
      -- Вывод только тех департаментов, где количество сотрудников больше 10
      SELECT department, COUNT(id) as employee_count
      FROM employees
      GROUP BY department
      HAVING COUNT(id) > 10;
  3. ORDER BY

    • Цель: Для сортировки результирующего набора данных на основе значения, вычисленного агрегатной функцией.
      -- Сортировка департаментов по убыванию суммарной зарплаты
      SELECT department, SUM(salary) as total_salary
      FROM employees
      GROUP BY department
      ORDER BY total_salary DESC;

Важное замечание: Агрегатные функции нельзя использовать в секции WHERE, так как WHERE фильтрует строки до того, как происходит группировка и вычисление агрегатов. Для фильтрации по результатам агрегации всегда используется HAVING.

Ответ 18+ 🔞

Ну, слушай сюда, разберём этот SQL-срач, как Герасим Муму топил, только без трагедии, блядь.

Вот есть у тебя эти ваши функции-агрегаты: COUNT, SUM, AVG и прочая хуйня. Они берут кучу строк, жмут их в один комок и выдают тебе одну цифру. И вот куда их, этих зверей, можно пихать, чтобы не вышло как у Тургенева — пиздец и всё.

1. В SELECT Сюда их суют чаще всего, когда хотят посчитать что-то по группам. Обычно с GROUP BY в паре, а то получится одна большая группа на весь запрос, и ты такой: «Ну и хуй с ним».

-- Считаем среднюю зарплату по конторам (департаментам)
SELECT department, AVG(salary) as average_salary
FROM employees
GROUP BY department;

Вот смотри: AVG(salary) — это агрегат. Он схлопывает всех сотрудников в каждой конторе в одну среднюю циферку. Без GROUP BY он бы схлопнул всю таблицу в одну строчку, и ты бы нихуя не понял, где платят больше.

2. В HAVING — вот это, блядь, важно! HAVING — это как WHERE, но для результатов после того, как всё посчитали и сгруппировали. WHERE фильтрует строки до агрегации, а HAVINGпосле. Запомни эту хуйню, а то будешь как Герасим — немой и ничего не спросишь.

-- Показываем только те конторы, где народу больше 10 душ
SELECT department, COUNT(id) as employee_count
FROM employees
GROUP BY department
HAVING COUNT(id) > 10;

Видишь? COUNT(id) — агрегат. Мы сначала посчитали всех в каждой конторе, а потом HAVING говорит: «А теперь, сука, покажи только те, где счётчик перевалил за десятку». Если бы тут был WHERE, он бы отфильтровал отдельных сотрудников до подсчёта, и всё бы пошло по пизде.

3. В ORDER BY Тут всё просто, как три копейки. Отсортировать результат можно и по тому, что насчитала агрегатная функция.

-- Сортируем конторы по тому, сколько бабла в сумме платят, от жирных к тощим
SELECT department, SUM(salary) as total_salary
FROM employees
GROUP BY department
ORDER BY total_salary DESC;

SUM(salary) — агрегат, а ORDER BY на него смотрит и говорит: «Ага, вот эта контора — овердохуища бабла вывалила, ставь её наверх».

А теперь, блядь, главный гвоздь программы! Агрегатные функции НЕЛЬЗЯ, БЛЯДЬ, ИСПОЛЬЗОВАТЬ В WHERE! Совсем! Никак! В рот меня чих-пых! Почему? Да потому что WHERE работает ДО того, как SQL посчитает эти самые COUNT и SUM. Он фильтрует сырые строки по одной. Ему не с чем работать, он нихуя не знает про итоги по группам. Это как спросить у Герасима, пока он Муму ещё не утопил: «Ну что, чувствуешь себя мудаком?» — а он ещё нихуя не чувствует.

Поэтому для фильтрации по результатам агрегации есть отдельная, специальная палочка-выручалочка — HAVING. Запомни: WHERE — для строк, HAVING — для групп после агрегации. Всё, вопрос закрыт, иди работай.