Ответ
DISTINCT — это оператор SQL, который удаляет дубликаты строк из результирующего набора данных.
Синтаксис:
-- Базовое использование
SELECT DISTINCT column1, column2 FROM table_name;
-- С агрегатными функциями
SELECT COUNT(DISTINCT department_id) FROM employees;
Примеры использования:
- Получение уникальных значений:
-- Уникальные города клиентов SELECT DISTINCT city FROM customers;
-- Уникальные комбинации города и страны SELECT DISTINCT city, country FROM customers;
2. **В Java/JPA (Hibernate):**
```java
// JPQL с DISTINCT
List<String> uniqueNames = entityManager.createQuery(
"SELECT DISTINCT e.name FROM Employee e", String.class
).getResultList();
// Criteria API
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<String> query = cb.createQuery(String.class);
Root<Employee> root = query.from(Employee.class);
query.select(root.get("department")).distinct(true);
- В Java Stream API:
List<String> names = Arrays.asList("Alice", "Bob", "Alice", "Charlie"); List<String> distinctNames = names.stream() .distinct() .collect(Collectors.toList()); // Результат: ["Alice", "Bob", "Charlie"]
Важные особенности:
- Производительность: DISTINCT требует сортировки или хэширования данных, что может быть затратно на больших таблицах
- NULL-значения: DISTINCT считает все NULL значения одинаковыми (один NULL в результате)
- Альтернативы: Для больших данных иногда эффективнее использовать GROUP BY:
-- Эквивалентные запросы SELECT DISTINCT department FROM employees; SELECT department FROM employees GROUP BY department;
Лучшие практики:
- Используйте только необходимые столбцы в DISTINCT
- Рассмотрите создание индексов на часто используемых столбцах
- Для сложных запросов анализируйте план выполнения