Какие агрегатные функции в SQL вы знаете и для чего они используются?

Ответ

Агрегатные функции в SQL выполняют вычисления над набором значений и возвращают одно результирующее значение. Они часто используются с оператором GROUP BY для группировки данных.

Основные функции:

  • COUNT(): Подсчитывает количество строк. COUNT(*) считает все строки, а COUNT(column) — строки, где column не равен NULL.
  • SUM(): Вычисляет сумму всех значений в числовом столбце.
  • AVG(): Вычисляет среднее значение в числовом столбце.
  • MAX() / MIN(): Находят максимальное и минимальное значение в столбце.
  • GROUP_CONCAT() (MySQL) или STRING_AGG() (PostgreSQL): Объединяет значения из нескольких строк в одну строку с указанным разделителем. Очень полезна для получения списков связанных сущностей в одном запросе.

Пример использования в Go:

// Запрос для получения средней зарплаты и количества сотрудников по отделам
rows, err := db.Query(`
    SELECT department, AVG(salary), COUNT(*) 
    FROM employees 
    GROUP BY department
`)
if err != nil {
    log.Fatal(err)
}
// ... дальнейшая обработка результата

В NoSQL базах данных, таких как MongoDB, похожая функциональность достигается с помощью Aggregation Pipeline и операторов $group, $sum, $avg и т.д.

Ответ 18+ 🔞

Слушай, а вот эти ваши агрегатные функции в SQL — это вообще огонь, если честно. Ну то есть, они берут кучу значений и выдают тебе один, ёпта, итоговый результат. Как будто ты с друзьями в баре скидываешься на кальян, а потом один идиот считает, кто сколько должен. Вот это они и делают, только без мата и обид.

Особенно они любят прикинуться к оператору GROUP BY, чтобы данные по группам раскидать. Без него они всю таблицу как один большой комок и посчитают, что тоже иногда полезно, но не так изящно.

Вот главные затейники:

  • COUNT(): Считает, сколько строк нагнулось под твоим запросом. COUNT(*) — всех подряд, а COUNT(column) — только тех, у кого в этой колонке не NULL. То есть, если там пустота — он такую строку в зачёт не берёт, хитрая жопа.
  • SUM(): Берёт все цифры в столбце и складывает их. Проще пареной репы, но без неё никуда.
  • AVG(): Вычисляет среднюю температуру по больнице. Сумму всех делит на их количество. Главное — не пытайся среднее арифметическое от имён сотрудников посчитать, получишь пиздец и ошибку.
  • MAX() / MIN(): Находят самого большого и самого маленького в стаде. Кто зарплату больше всех получает, а кто меньше всех работает — они мгновенно вычислят.
  • GROUP_CONCAT() (в MySQL) или STRING_AGG() (в PostgreSQL): А вот это, блядь, магия чистой воды! Берёт значения из кучи строк и склеивает в одну строку через разделитель. Представь, тебе нужно получить всех сотрудников отдела в одну строчку через запятую. Без этого пришлось бы городить огород в коде, а тут — раз, и готово. Просто ебушки-воробушки!

Ну и как это в коде на Go выглядит, смотри:

// Запрос, чтобы узнать, кто сколько в среднем получает и сколько их, по отделам
rows, err := db.Query(`
    SELECT department, AVG(salary), COUNT(*) 
    FROM employees 
    GROUP BY department
`)
if err != nil {
    log.Fatal(err) // Если запрос наебнулся — логируем и в утиль
}
// ... а дальше уже выгребаешь результат и делаешь с ним что хочешь

А в этих ваших модных NoSQL базах, типа MongoDB, там вообще своя атмосфера. Там нет SQL, зато есть Aggregation Pipeline, где ты как в конструкторе цепочку операторов выстраиваешь: $group, $sum, $avg. Принцип тот же, но выглядит так, будто ты не базу данных запрашиваешь, а ритуал чёрной магии проводишь. Но в целом, тоже ничего, работает.