Когда я читаю другие сообщения об этом, я все еще не вижу разницу в SQL между GROUP BY и ORDER BY. Что это? - PullRequest
2 голосов
/ 25 июля 2010

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 25 июля 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 влияет на выход.

1 голос
/ 25 июля 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, и результат будет отсортирован после группировки.

1 голос
/ 25 июля 2010

Порядок сортирует ваши результаты - одна строка результатов на одну подходящую (где предложение) строку в базе данных

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

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

При заказе вы получите все оценки учеников для всех учителей

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

1 голос
/ 25 июля 2010

Вместо:

a   2
a   4
a   2
a   1
a   2

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

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

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

...