в чем разница между GROUP BY и ORDER BY в sql

119

Когда вы вообще что используете? Примеры очень приветствуются!

Я имею в виду MySql, но не могу представить, что концепция отличается от другой СУБД.

vehomzzz
источник

Ответы:

79

ORDER BY изменяет порядок возврата товаров.

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

CMerat
источник
130
Это утверждение практически не имеет смысла без сопровождающего примера.
JohnMerlino
2
Я думаю, что второго примера на странице по ссылке достаточно, чтобы понять разницу: tutorialspoint.com/sql/sql-group-by.htm
nishantbhardwaj2002,
Не могли бы вы привести пример?
Райс
249

ORDER BY изменяет порядок возврата товаров.

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

TABLE:
ID NAME
1  Peter
2  John
3  Greg
4  Peter

SELECT *
FROM TABLE
ORDER BY NAME

= 
3 Greg
2 John
1 Peter
4 Peter

SELECT Count(ID), NAME
FROM TABLE
GROUP BY NAME

= 
1 Greg
1 John 
2 Peter

SELECT NAME
FROM TABLE
GROUP BY NAME
HAVING Count(ID) > 1

=
Peter
RiddlerDev
источник
2
Что, если в таблице есть ageстолбец, в котором Петерс имеет разный возраст, а запрос - ВЫБРАТЬ ИМЯ, ВОЗРАСТ ИЗ ТАБЛИЦЫ ГРУППА ПО ИМЕНИ?
Варун
1
Вы не можете вернуть столбцы, которые не входят в вашу группу, или не имеют метода. Таким образом, вам нужно будет либо добавить возраст в группу по, либо сделать что-то вроде Max (Age).
RiddlerDev
78

ORDER BY: отсортируйте данные в порядке возрастания или убывания.

Рассмотрим таблицу CUSTOMERS :

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

Ниже приведен пример сортировки результатов в порядке возрастания по ИМЕНИ:

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME;

Это даст следующий результат:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
+----+----------+-----+-----------+----------+

GROUP BY: объедините идентичные данные в группы.

Теперь в таблице CUSTOMERS есть следующие записи с повторяющимися именами:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Ramesh   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | kaushik  |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

если вы хотите сгруппировать одинаковые имена в одно имя, запрос GROUP BY будет следующим:

SQL> SELECT * FROM CUSTOMERS
     GROUP BY NAME;

Это даст следующий результат: (для одинаковых имен он выбирает последнее и, наконец, сортирует столбец в порядке возрастания)

    +----+----------+-----+-----------+----------+   
    | ID | NAME     | AGE | ADDRESS   | SALARY   |
    +----+----------+-----+-----------+----------+
    |  5 | Hardik   |  27 | Bhopal    |  8500.00 |
    |  4 | kaushik  |  25 | Mumbai    |  6500.00 |
    |  6 | Komal    |  22 | MP        |  4500.00 |
    |  7 | Muffy    |  24 | Indore    | 10000.00 |
    |  2 | Ramesh   |  25 | Delhi     |  1500.00 |
    +----+----------+-----+-----------+----------+

как вы сделали вывод, что он бесполезен без функций SQL, таких как sum, avg и т. д.

поэтому просмотрите это определение, чтобы понять правильное использование GROUP BY:

Предложение GROUP BY работает со строками, возвращаемыми запросом, суммируя идентичные строки в одну / отдельную группу и возвращает одну строку со сводкой для каждой группы, используя соответствующую функцию Aggregate в списке SELECT, например COUNT (), SUM (), MIN (), MAX (), AVG () и т. Д.

Теперь, если вы хотите узнать общую сумму зарплаты каждого клиента (имя), запрос GROUP BY будет следующим:

SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS
     GROUP BY NAME;

Это даст следующий результат: (сумма зарплат идентичных имен и сортировка столбца ИМЯ после удаления идентичных имен)

+---------+-------------+
| NAME    | SUM(SALARY) |
+---------+-------------+
| Hardik  |     8500.00 |
| kaushik |     8500.00 |
| Komal   |     4500.00 |
| Muffy   |    10000.00 |
| Ramesh  |     3500.00 |
+---------+-------------+
JerryGoyal
источник
25

Разница в том, что подразумевает название: группа по выполняет операцию группировки и упорядочивает по сортировке.

Если вы это сделаете, SELECT * FROM Customers ORDER BY Nameвы получите список результатов, отсортированный по именам клиентов.

Если вы это сделаете, SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActiveвы получите количество активных и неактивных клиентов. Группа по агрегировала результаты на основе указанного вами поля.

Макс Шмелинг
источник
3
Более того: если вы ГРУППИРУЕТЕ, результаты не обязательно отсортированы; хотя во многих случаях они могут появляться в интуитивно понятном порядке, это не гарантируется предложением GROUP. Если вы хотите, чтобы ваши группы были отсортированы, всегда используйте явное ORDER BY после GROUP BY.
Дэйв Коста,
16

Они имеют совершенно разное значение и вообще не связаны между собой.

ORDER BY позволяет вам отсортировать набор результатов по различным критериям, таким как сначала отсортировать по имени от z, а затем отсортировать по цене от наибольшей к наименьшей.

(ЗАКАЗАТЬ ПО НАЗВАНИЮ, ПО УБЫТКУ)

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

PatrikAkerstrand
источник
8

Простой, ORDER BYупорядочивает данные и GROUP BYгруппирует или объединяет данные.

ORDER BY упорядочивает набор результатов в соответствии с указанным полем по умолчанию в порядке возрастания.

Предположим, вы запускаете запрос, поскольку ORDER BY (student_roll_number)он покажет вам результат в порядке возрастания номеров списка учеников. Здесь student_roll_numberзапись может происходить более одного раза.

В GROUP BYслучае, если мы используем это с агрегатными функциями, и он группирует данные согласно агрегатной функции, и мы получаем результат. Здесь, если наш запрос имеет SUM (marks)вместе с GROUP BY (student_first_name)ним, будет отображаться сумма оценок учащихся, принадлежащих к каждой группе (где все члены группы будут иметь одинаковое имя).

Свапнил Чинчолкар
источник
4

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

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

Кэтэлин Питиш
источник
4

Есть несколько хороших примеров. Точно так же, как добавить свой собственный из веб-таблицы, который дает хорошие четкие примеры, а также позволяет вам выполнять свой собственный SQL.

Порядок SQL по

Группа SQL по

kevchadders
источник
1

ORDER BYпоказывает поле в порядке возрастания или убывания. Хотя GROUP BYпоказывает одинаковые имена полей, идентификаторы и т. Д. Только в одном выводе.

Im_khan
источник
4
Этот ответ не содержит дополнительной информации, о которой еще не говорится в принятом или любом другом ответе.
newfurniturey
1
  1. GROUP BY будет агрегировать записи по указанному столбцу, что позволяет выполнять функции агрегирования для несгруппированных столбцов (таких как SUM, COUNT, AVG и т. Д.). ORDER BY изменяет порядок возврата товаров.
  2. Если вы выполните SELECT IsActive, COUNT (*) FROM Customers GROUP BY IsActive, вы получите количество активных и неактивных клиентов. Группа по агрегировала результаты на основе указанного вами поля. Если вы сделаете SELECT * FROM Customers ORDER BY Name, вы получите список результатов, отсортированный по имени клиента.
  3. Если вы ГРУППИРУЕТЕ, результаты не обязательно отсортированы; хотя во многих случаях они могут появляться в интуитивно понятном порядке, это не гарантируется предложением GROUP. Если вы хотите, чтобы ваши группы были отсортированы, всегда используйте явно ORDER BY после GROUP BY.
  4. Сгруппированные данные нельзя фильтровать с помощью предложения WHERE. Данные заказа можно фильтровать с помощью предложения WHERE.
Хадиджа
источник
0

Следует отметить, что GROUP BYэто не всегда необходимо, поскольку (по крайней мере, в PostgreSQL и, вероятно, в других вариантах SQL) вы можете использовать ORDER BYсписок, и вы все равно можете использовать ASCили для DESC каждого столбца ...

SELECT name_first, name_last, dob 
FROM those_guys 
ORDER BY name_last ASC, name_first ASC, dob DESC;
Джон
источник