Как выполнить группировку данных в Java и SQL?

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

Ответ

В Java группировку данных удобно выполнять с помощью Stream API и коллектора Collectors.groupingBy().

import java.util.*;
import java.util.stream.Collectors;

List<String> names = Arrays.asList("John", "Jane", "Adam", "Eve");

// Группировка строк по их длине
Map<Integer, List<String>> groupedByLength = names.stream()
    .collect(Collectors.groupingBy(String::length));
// Результат: {4=[John, Jane, Adam], 3=[Eve]}

// Многоуровневая группировка и агрегация
Map<Integer, Long> countByLength = names.stream()
    .collect(Collectors.groupingBy(String::length, Collectors.counting()));
// Результат: {4=3, 3=1}

В SQL для группировки используется оператор GROUP BY, часто в сочетании с агрегатными функциями (COUNT, SUM, AVG).

-- Группировка пользователей по городу и подсчет их количества
SELECT city, COUNT(*) as user_count
FROM users
GROUP BY city;

Ключевые моменты:

  • В Java groupingBy создает Map, где ключ — критерий группировки, а значение — коллекция элементов.
  • Для сложной логики можно использовать кастомные коллекторы.
  • В SQL индексы на полях, используемых в GROUP BY, могут значительно ускорить выполнение запроса.