qual é a diferença entre GROUP BY e ORDER BY em sql

119

Quando você usa qual em geral? Exemplos são altamente encorajados!

Estou me referindo ao MySql, mas não consigo imaginar o conceito diferente em outro DBMS

vehomzzz
fonte

Respostas:

79

ORDER BY altera a ordem em que os itens são devolvidos.

GROUP BY agregará registros pelas colunas especificadas, o que permite executar funções de agregação em colunas não agrupadas (como SUM, COUNT, AVG etc.).

CMerat
fonte
130
Esta afirmação não faz praticamente sentido sem um exemplo anexo.
JohnMerlino
2
eu acho que o segundo exemplo na página no link é suficiente para entender a diferença tutorialspoint.com/sql/sql-group-by.htm
nishantbhardwaj2002
Você pode fornecer um exemplo?
Rice
249

ORDER BY altera a ordem em que os itens são devolvidos.

GROUP BY agregará registros pelas colunas especificadas, o que permite executar funções de agregação em colunas não agrupadas (como SUM, COUNT, AVG etc.).

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
fonte
2
E se a tabela tiver agecoluna, com Peters com idades diferentes e a consulta for SELECT NAME, IDADE DO GRUPO DE TABELAS POR NOME?
Varun
1
Você não pode retornar colunas que não estão no seu grupo ou que possuem um método. Então, você precisa adicionar a idade ao grupo, ou fazer algo como Max (Idade).
RiddlerDev
78

ORDER BY: ordena os dados em ordem crescente ou decrescente.

Considere a tabela CLIENTES :

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

A seguir, é apresentado um exemplo, que classificaria o resultado em ordem crescente por NAME:

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME;

Isso produziria o seguinte resultado:

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

GRUPO POR: organize dados idênticos em grupos.

Agora, a tabela CLIENTES possui os seguintes registros com nomes duplicados:

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

se você quiser agrupar nomes idênticos em nome único, a consulta GROUP BY será a seguinte:

SQL> SELECT * FROM CUSTOMERS
     GROUP BY NAME;

Isso produziria o seguinte resultado: (para nomes idênticos, escolheria o último e finalmente classificaria a coluna em ordem crescente)

    +----+----------+-----+-----------+----------+   
    | 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 |
    +----+----------+-----+-----------+----------+

como você deduziu que é inútil sem funções SQL como sum, avg etc.

portanto, siga esta definição para entender o uso adequado do GROUP BY:

Uma cláusula GROUP BY funciona nas linhas retornadas por uma consulta, resumindo linhas idênticas em um grupo único / distinto e retorna uma única linha com o resumo de cada grupo, usando a função Aggregate apropriada na lista SELECT, como COUNT (), SUM (), MIN (), MAX (), AVG () etc.

Agora, se você deseja saber o valor total do salário de cada cliente (nome), a consulta GROUP BY seria a seguinte:

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

Isso produziria o seguinte resultado: (soma dos salários de nomes idênticos e classifique a coluna NAME após remover nomes idênticos)

+---------+-------------+
| NAME    | SUM(SALARY) |
+---------+-------------+
| Hardik  |     8500.00 |
| kaushik |     8500.00 |
| Komal   |     4500.00 |
| Muffy   |    10000.00 |
| Ramesh  |     3500.00 |
+---------+-------------+
JerryGoyal
fonte
25

A diferença é exatamente o que o nome indica: um grupo executando uma operação de agrupamento e uma ordem por classificação.

Se o fizer SELECT * FROM Customers ORDER BY Name, você obtém a lista de resultados classificada pelo nome do cliente.

Se você SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActivereceber uma contagem de clientes ativos e inativos. O grupo agregou os resultados com base no campo que você especificou.

Max Schmeling
fonte
3
Além disso: se você agrupar, os resultados não serão necessariamente classificados; embora, em muitos casos, eles possam sair em uma ordem intuitiva, isso não é garantido pela cláusula GROUP. Se você deseja que seus grupos sejam classificados, sempre use uma explicação ORDER BY após o GROUP BY.
Dave Costa
16

Eles têm um significado totalmente diferente e não estão realmente relacionados.

ORDER BY permite classificar o conjunto de resultados de acordo com critérios diferentes, como primeiro classificar por nome de az e, em seguida, classificar pelo preço mais alto para o mais baixo.

(PEDIDO POR nome, preço DESC)

GROUP BY permite que você pegue seu conjunto de resultados, agrupe-o em grupos lógicos e execute consultas agregadas nesses grupos. Por exemplo, você pode selecionar todos os funcionários, agrupá-los por local de trabalho e calcular o salário médio de todos os funcionários de cada local de trabalho.

PatrikAkerstrand
fonte
8

Simples, ORDER BYordena os dados e GROUP BYgrupos ou combina os dados.

ORDER BY ordena o conjunto de resultados conforme o campo mencionado, por padrão, em ordem crescente.

Suponha que você esteja disparando uma consulta ORDER BY (student_roll_number), pois ela mostrará o resultado em ordem crescente dos números de rolo dos alunos. Aqui, a student_roll_numberentrada pode ocorrer mais de uma vez.

No GROUP BYcaso, usamos isso com funções agregadas, e agrupa os dados de acordo com a função agregada, e obtemos o resultado. Aqui, se a nossa consulta SUM (marks)contiver, GROUP BY (student_first_name)ela mostrará a soma das marcas dos alunos pertencentes a cada grupo (onde todos os membros de um grupo terão o mesmo nome).

Swapnil Chincholkar
fonte
4

GROUP BY é usado para agrupar linhas em uma seleção, geralmente ao agregar linhas (por exemplo, calcular totais, médias, etc. para um conjunto de linhas com os mesmos valores para alguns campos).

ORDER BY é usado para ordenar as linhas resultantes de uma instrução select.

Cătălin Pitiș
fonte
4

Alguns bons exemplos lá. Assim como adiciono o meu no webcheatsheet, que fornece bons exemplos claros, além de permitir que você execute seu próprio SQL.

Ordem SQL por

Agrupar por SQL

kevchadders
fonte
1

ORDER BYmostra um campo em ordem crescente ou decrescente. Enquanto GROUP BYmostra os mesmos nomes de campo, IDs etc em apenas uma saída.

Im_khan
fonte
4
Esta resposta não fornece informações adicionais que a resposta aceita ou qualquer outra resposta fornecida ainda não indique.
Newfurniturey 26/10/12
1
  1. GROUP BY agregará registros pela coluna especificada, o que permite executar funções de agregação em colunas não agrupadas (como SUM, COUNT, AVG etc.). ORDER BY altera a ordem em que os itens são devolvidos.
  2. Se você SELECIONAR IsActive, COUNT (*) FROM Customers GROUP BY IsActive, obtém uma contagem de clientes ativos e inativos. O grupo agregou os resultados com base no campo que você especificou. Se você selecionar * FROM Customers ORDER BY Name, obterá a lista de resultados classificada pelo nome do cliente.
  3. Se você GROUP, os resultados não serão necessariamente classificados; embora, em muitos casos, eles possam sair em uma ordem intuitiva, isso não é garantido pela cláusula GROUP. Se você deseja que seus grupos sejam classificados, sempre use um ORDER BY explicitamente após o GROUP BY.
  4. Os dados agrupados não podem ser filtrados pela cláusula WHERE. Os dados do pedido podem ser filtrados pela cláusula WHERE.
Khadija
fonte
0

Note-se que GROUP BYnem sempre é necessário, pois (pelo menos no PostgreSQL e provavelmente em outras variantes do SQL) você pode usar ORDER BYcom uma lista e ainda pode usar ASCou DESC por coluna ...

SELECT name_first, name_last, dob 
FROM those_guys 
ORDER BY name_last ASC, name_first ASC, dob DESC;
John
fonte