Когда я читаю другие сообщения об этом, я все еще не вижу разницы в SQL между GROUP BY и ORDER BY. Что это такое?

Я начал свою собственную тему по этому вопросу, чтобы иметь меньше накладных расходов на публикацию его в чужой теме. Мне трудно понять в SQL, в чем разница между GROUP BY и ORDER BY. Я знаю, что по этому поводу были созданы темы, но они не дают мне полезного ответа. Вот что-то в общих чертах одного и того же ответа, который я только что много раз видел в других темах:

ORDER BY сортирует строки на основе их значений в определенном столбце, тогда как GROUP BY группирует строки с одинаковыми значениями в определенном столбце, чтобы помочь с агрегатными функциями.

Мне кажется, что это фактически описывает одни и те же вещи в двух разных формулировках. Мне в основном нужно это перефразировать полностью. Проблема в том, что ORDER BY «группирует» так же, как GROUP BY, возможно, с единственным исключением, что GROUP BY может не гарантировать наличие какого-то особого порядка. Кроме того, я просто не вижу, как GROUP BY может помочь с агрегатной функцией, которую мог бы использовать ORDER BY.

Пожалуйста, объясните разницу иначе, чем большинство. Спасибо!


person Panzercrisis    schedule 25.07.2010    source источник
comment
stackoverflow.com/questions/1277460/   -  person Tom Gullen    schedule 25.07.2010
comment
ORDER BY — это единственный способ обеспечить согласованность порядка возвращаемых данных. Без него вы полагаетесь на порядок ввода (порядок добавления записей).   -  person OMG Ponies    schedule 25.07.2010


Ответы (4)


Вместо:

a   2
a   4
a   2
a   1
a   2

GROUP BY покажет ОДНУ букву «a», за которой следует какая-то агрегация другого столбца (может быть, средняя).

ORDER BY сохранит все a a a a a a и просто упорядочит строки на основе одного из столбцов (поэтому, возможно, 1 будет первым).

Таким образом, в конце концов, GROUP BY приведет к одной строке в этом случае, а ORDER BY будет иметь то же количество строк, что и исходное.

person BobTurbo    schedule 25.07.2010

Вероятно, лучше всего это проиллюстрировать на примере. Рассмотрим таблицу лиц:

ID  Gender  Name
 1    M     Fred
 2    M     Bob
 3    F     Jane
 4    M     Alex
 5    F     Mary

Бежать:

SELECT * FROM person ORDER BY gender

и вы получаете:

ID  Gender  Name
 3    F     Jane
 5    F     Mary
 1    M     Fred
 2    M     Bob
 4    M     Alex

Но беги:

SELECT gender, COUNT(1) FROM person GROUP BY gender

и вы получаете:

Gender  COUNT(1)
  M        3
  F        2

Другая часть этого, которую вам нужно понять, — это разница между WHERE и HAVING. Рассмотреть возможность:

SELECT gender, COUNT(1) FROM person WHERE name = 'Bob' GROUP BY gender

Результат:

Gender  COUNT(1)
  M        1

но:

SELECT gender, COUNT(1) FROM person GROUP BY gender HAVING COUNT(1) > 2

результат:

Gender  COUNT(1)
  M        3

По сути, ORDER BY изменяет порядок строк (которые затем могут быть «направлены» в агрегацию), тогда как HAVING фильтрует результаты агрегации. Другими словами, WHERE влияет на ввод GROUP BY, HAVING влияет на вывод.

person cletus    schedule 25.07.2010
comment
Я думаю, что это поможет ему больше, если вы сделаете тот же вызов, за исключением изменения порядка на группировку. показывая два разных вызова, вы рискуете, что он все еще не поймет :), но это было полезно :) - person corroded; 25.07.2010
comment
Ключевое различие между предложениями WHERE и HAVING заключается в том, что вы не можете использовать агрегатные функции (вне подзапроса) в WHERE — только в HAVING. - person OMG Ponies; 25.07.2010
comment
То, что сказал Корродед, было в основном так. Это была еще одна проблема, с которой я столкнулся, узнав об отличии от других потоков. Люди предоставляли два очень разных фрагмента кода, в зависимости от того, показывали ли они GROUP BY или ORDER BY. Проблема в том, что есть другие вещи, которые вносят другие изменения. Мне просто нужно было посмотреть, какие изменения будут в зависимости от того, какой из двух был использован. Спасибо, в любом случае. - person Panzercrisis; 25.07.2010

Сортировка по сортировке результатов -- одна строка результатов на одну совпадающую (предложение where) строку в базе данных.

Группа по дает вам меньше строк результатов, чем совпадающие строки (предложение where) в вашей базе данных.

Например, у вас есть таблица средних оценок учащихся (0–4,0) на одного учителя.

Упорядочить по даст вам все оценки учеников для всех учителей

Группировка по учителям даст вам один результат для каждого учителя. Обычно вы выбираете что-то вроде среднего значения полей GPA, поэтому вы получаете одно число GPA для каждого учителя.

person Larry K    schedule 25.07.2010

Предложение order by используется для сортировки результатов по критерию, а предложение group by используется для размещения записей в группах, где критерии являются общими для записей.

Рассмотрим таблицу Test, выглядящую следующим образом:

Name  Number
-----------------
B     1
B     2
C     3
C     4
C     5
A     6
A     7
A     8

Если вы запустите этот запрос:

select Name, Number
from Test
order by Name

В итоге вы получите результат со всеми отсортированными записями:

A     6
A     7
A     8
B     1
B     2
C     3
C     4
C     5

Когда вы группируете записи, результатом становятся не записи, а группы. Вы можете использовать агрегаты, такие как, например, count, min и max, чтобы получить характеристики, включающие все записи из этой группы.

Если вы запустите этот запрос:

select Name, count(*) as Cnt, min(Number) as Min, max(Number) as Max
from Test
group by Name

В итоге вы получите результат, содержащий три группы, так как есть три разных имени:

Name  Cnt  Min  Max
----------------------
B     2    1    2
C     3    3    5
A     3    6    8

Обратите внимание, что группировка не означает, что результат сортируется по критериям, по которым вы группируете. Если вы также хотите этого, вы должны использовать как group by, так и order by, и результат будет отсортирован после того, как он был сгруппирован.

person Guffa    schedule 25.07.2010
comment
Я оставил комментарий к посту другого парня, который применим и здесь. Спасибо, в любом случае. - person Panzercrisis; 25.07.2010
comment
@Panzercrisis: я показал вам, для чего используется group by. Если вы просто используете его, как показал BobTurbo, вы не должны этого делать. Вместо этого вы должны использовать distinct. - person Guffa; 25.07.2010