Есть ли причина для предложения GROUP BY без функции агрегирования?

В настоящий момент я (полностью) изучаю SQL и наткнулся на предложение GROUP BY.

GROUP BY объединяет или группирует набор результатов в соответствии с заданными вами аргументами. Если вы используете это предложение в запросе, вы можете затем выполнять агрегатные функции с набором результатов, чтобы найти статистическую информацию о наборе результатов, например, поиск средних (AVG()) или частоты (COUNT()).

Мой вопрос: полезен ли оператор GROUP BY без сопутствующей агрегатной функции?

Обновление Использование GROUP BY в качестве синонима для DISTINCT (вероятно) плохая идея, потому что я подозреваю, что это медленнее.


person Niels Bom    schedule 04.02.2010    source источник


Ответы (5)


полезен ли оператор GROUP BY без сопутствующей агрегатной функции?

Использование DISTINCT было бы синонимом в такой ситуации, но причина, по которой вы хотите / должны определить предложение GROUP BY, заключается в том, чтобы иметь возможность определять детали предложения HAVING.

Если вам нужно определить предложение HAVING, вы должны определить GROUP BY - вы не можете сделать это вместе с DISTINCT.

person OMG Ponies    schedule 04.02.2010
comment
@Niels: Зависит от данных и модели данных, но IME у меня никогда не было потребности, которую я могу вспомнить - person OMG Ponies; 04.02.2010

Вы можете выполнить выбор DISTINCT, используя GROUP BY без каких-либо AGGREGATES.

person Adriaan Stander    schedule 04.02.2010

Группировать по можно использовать Двусторонним в основном
1) в сочетании с функциями агрегирования SQL;
2) для удаления повторяющихся строк из набор результатов

Итак, ответ на ваш вопрос заключается во второй части описанных выше ЕГЭ.

person Ashish Agarwal    schedule 04.02.2010

Примечание: все нижеприведенное относится только к MySQL

GROUP BY гарантированно вернет результаты по порядку, DISTINCT не .

GROUP BY вместе с ORDER BY NULL имеет ту же эффективность, что и DISTINCT (и реализован таким образом). Если есть индекс для агрегируемого (или определяемого) поля, оба предложения используют свободное сканирование индекса по этому полю.

В GROUP BY вы можете возвращать несгруппированные и неагрегированные выражения. MySQL выберет любые случайные значения из соответствующей группы для вычисления выражения.

Используя GROUP BY, вы можете опустить выражения GROUP BY из предложения SELECT. С DISTINCT вы не можете. Каждая строка, возвращаемая DISTINCT, гарантированно уникальна.

person Quassnoi    schedule 04.02.2010

Он используется не только для функций агрегирования.

Например, рассмотрим следующий код:

SELECT product_name, MAX('last_purchased') FROM products GROUP BY product_name

Это вернет только 1 результат для каждого продукта, но с последним обновленным значением этих записей.

person Amirshk    schedule 04.02.2010
comment
MAX() - агрегатная функция. - person Max Shawabkeh; 04.02.2010
comment
@am: Нилс спрашивает об использовании без функции агрегирования - person Ashish Agarwal; 04.02.2010
comment
Он не агрегирует, он выбирает одно значение из списка. Совокупность - это совокупность элементов, которые собраны вместе, чтобы сформировать общее количество - person Amirshk; 04.02.2010
comment
Это агрегат, поскольку он принимает группу значений, каждое из разных строк, и возвращает вам один результат - это определение агрегатных функций в SQL. - person Max Shawabkeh; 04.02.2010
comment
@Max, воспринимается как несправедливое языковое различие :), думаю, я неправильно понял Q. - person Amirshk; 04.02.2010