Сколько записей будет с использованием distinct и без него по уникальному полю
Что проверяют
Понимаете ли вы, к чему относится DISTINCT и когда он бесполезен. Ответ на вопрос в лоб короткий: по действительно уникальному полю количество строк совпадёт, дубликатов нет и схлопывать нечего. Дальше смотрят, найдёте ли вы случаи, когда это перестаёт быть правдой.
Как отвечать
Начните с главного: DISTINCT относится ко всему списку выбранных столбцов, а не к первому после ключевого слова. Запрос select distinct id, status даёт уникальность по паре значений, и если id уже уникален, результат совпадёт с запросом без distinct.
select distinct u.id from users u; -- столько же строк, сколько без distinct
select distinct u.id from users u
join orders o on o.user_id = u.id; -- строк станет меньшеВторой запрос и есть тот самый случай: соединение один ко многим размножает строки пользователя по числу заказов, и уникальность колонки тут не спасает. Отдельно про пустые значения: distinct считает null одинаковыми и схлопывает их в одно, хотя уникальный индекс несколько null в колонке обычно допускает.
Для Java-позиции добавьте про JPA. Дубли корневой сущности при join fetch коллекции исторически лечили через select distinct в JPQL, в свежих версиях Hibernate дубли убираются сами и лишний distinct в SQL уже не уходит. Помните и про цену: это сортировка или хеш-агрегация поверх выборки.
Где спотыкаются
Отвечают, что DISTINCT всегда уменьшает количество строк. По уникальному полю без соединений он не уменьшает ничего, зато добавляет работу, которую планировщик не всегда умеет выбросить.
Второе: думают, что уникальность считается по одной колонке, и удивляются, когда добавленный в выборку столбец возвращает дубликаты обратно. Если нужно ровно по одной колонке, в PostgreSQL есть distinct on, в остальных случаях это оконная функция или группировка.
Третье: лечат через distinct дубли, порождённые соединением, вместо того чтобы убрать само соединение. Когда вторая таблица нужна только для проверки условия, exists с подзапросом и дешевле, и честнее по смыслу.