Ответ
Агрегатные функции (такие как COUNT, SUM, AVG, MAX, MIN) используются для выполнения вычислений над набором строк и возвращения одного итогового значения. Их можно применять в следующих секциях SQL-запроса:
-
SELECT- Цель: Для вычисления итоговых значений по столбцам. Обычно используется вместе с
GROUP BY.-- Подсчет средней зарплаты в каждом департаменте SELECT department, AVG(salary) as average_salary FROM employees GROUP BY department;
- Цель: Для вычисления итоговых значений по столбцам. Обычно используется вместе с
-
HAVING- Цель: Для фильтрации групп строк после их агрегации.
HAVINGработает с результатами агрегатных функций, в отличие отWHERE, который фильтрует строки до агрегации.-- Вывод только тех департаментов, где количество сотрудников больше 10 SELECT department, COUNT(id) as employee_count FROM employees GROUP BY department HAVING COUNT(id) > 10;
- Цель: Для фильтрации групп строк после их агрегации.
-
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 — для групп после агрегации. Всё, вопрос закрыт, иди работай.