7

Читаем:

Оператор SQL DISTINCT используется для указания на то, что следует работать только с уникальными значениями столбца.

Оператор SQL GROUP BY используется для объединения результатов выборки по одному или нескольким столбцам.

В результате работы с этими предикатами мы получаем уникальные записи по какому либо ключу. Не могу понять в чем их различие.

---- Добалено -----

В моем понимании что GROUP BY - это группировка по какому либо признаку, а то есть например есть поле со значениями:

1
2
3
1
2
3

после GROUP BY они должны стать:

1
1
2
2
3
3

а на деле получаем:

1
2
3

В чем причина?

Pavel Mayorov
  • 58,537
perfect
  • 10,021
  • в случае с group by мы получаем на выходе дерево – Bald Oct 05 '16 at 07:08
  • @Bald, а как происходит вывод из дерева если это не табличная структура? – perfect Oct 05 '16 at 07:09
  • а вот этот вопрос уже к Вам, для полученного дерева можно получить какое то значение применив Sum(),Min(),Max(),... или же вы сами сможете его построить... обходя результаты группировки – Bald Oct 05 '16 at 07:11
  • @Bald, вот теперь стало понятно, мы можем получить вычисляемую запись. я прав? – perfect Oct 05 '16 at 07:13
  • если говорить про ваш пример то при помощи group by можно получить например количество дубликатов, или например сумму заказа состоящего из некоторого кол-ва позиций сделав группировку по заказу – Bald Oct 05 '16 at 07:15
  • @Bald, ну смотрите как работает мое видиние ) : получить - это значит взять, вычислить - это значит применить какое либо действие. если без придирок то мне теперь все ясно. большое спасибо за то что откликнулись. ваше слово дерево внесло ясность в суть моей проблемы. – perfect Oct 05 '16 at 07:19
  • Странный вообще вопрос! Это почти что спросить чем машина отличается от велосипедного колеса, несвязные вещи по сути – MaximPro Oct 17 '16 at 04:33

3 Answers3

18

DISTINCT - получить уникальные строки (отличающиеся друг от друга любым отображаемым полем). Работает чуть быстрее.

GROUP BY - сгруппировать по какому-либо признаку, при этом можно использовать агрегатные функции SUM, AVG, MAX и т.д.

Добавлено

Дано

1
2
3
1
2
3

С помощью ORDER BY получим сортировку

1
1
2
2
3
3

С помощью DISTINCT уникальные значения

1
2
3

А с помощью GROUP BY можно посчитать кол-во вхождений

SELECT value, COUNT(*) FROM table_test
value COUNT(*)
1      2
2      2
3      2
Mrak
  • 1,778
  • 1
    скажем есть поле с набором записей {1,1,2,2,3,3} . можно применить к нему DISTINCT и получить {1,2,3} а можно применить GROUP BY и получить {1,2,3}. и первое и второе одно и то же. так в чем разница? Определение я прочитать вполне способен а вот в чем разница их работы мне не совсем понятна.. – perfect Oct 05 '16 at 06:39
  • @perfect вы не совсем правильный пример приводите..... выполняют они разную функцию.... например вам нужно в столбце name выбрать только уникальные имена, тогда поможет Distinct.......... А если вам нужно например посчитать сумму рублей за все приобретенные товары на каждого покупателя - там будет Group ..даже если миллион юзеров с одинаковыми именами там будет........ никаким образом distinct не поможет.. – Алексей Шиманский Oct 05 '16 at 06:42
  • @АлексейШиманский, а как все приобретенные товары этим человеком попадут в одну единственную запись и вычислятся? Может я не совсем понимаю что в SELECT приходит.. Для меня SELECT это некий фильтр по колонкам(полям) – perfect Oct 05 '16 at 06:47
  • 1
    А за счет чего distinct работает чуть быстрее ? фактически он выполняет ту же сортировку, для подавления одинаковых строк ... – Mike Oct 05 '16 at 07:10
  • @perfect А вы поэкспериментируйте, так быстрее поймете. А select это не фильтр. Условие where в нем это фильтр. А group by - это правила объединения нескольких записей в одну – Mike Oct 05 '16 at 07:12
  • @Mike хороший вопрос: может Вы сами на него ответите/прокоментируете?! – Bald Oct 05 '16 at 07:12
  • 1
    @Mark Может добавите примерно такую формулировку: для distinct "(удаляет дубли)", для group by "Объединяет несколько строк в одну, с возможностью использовать агрегатные функции" – Mike Oct 05 '16 at 07:58
6

Разница в механике работы. Distinct - возвращает уникальные значения, GroupBy - группирует ВСЕ значения. В некоторых случаях результат будет одним и тем же. Правило использование простое - если можно использовать Distinct, используй его, если нет - то Gorup by.

T.Zagidullin
  • 343
  • 1
  • 7
0

SELECT DISTINCT исключает из результата повторяющиеся строки. SELECT DISTINCT ON исключает строки, совпадающие по всем указанным выражениям. SELECT ALL (по умолчанию) возвращает все строки результата, включая дубликаты.

GROUP BY - просто схлопывает повторяющиеся результаты в один.