Что делает оператор DISTINCT в SQL и где он применяется?

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

Ответ

DISTINCT — это оператор SQL, который удаляет дубликаты строк из результирующего набора данных.

Синтаксис:

-- Базовое использование
SELECT DISTINCT column1, column2 FROM table_name;

-- С агрегатными функциями
SELECT COUNT(DISTINCT department_id) FROM employees;

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

  1. Получение уникальных значений:
    
    -- Уникальные города клиентов
    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);
  1. В 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
  • Рассмотрите создание индексов на часто используемых столбцах
  • Для сложных запросов анализируйте план выполнения