qual è la differenza tra GROUP BY e ORDER BY in sql


119

Quando usi quale in generale? Gli esempi sono altamente incoraggiati!

Mi riferisco quindi a MySql, ma non riesco a immaginare che il concetto sia diverso su un altro DBMS

Risposte:


79

ORDER BY altera l'ordine in cui gli articoli vengono restituiti.

GROUP BY aggregherà i record in base alle colonne specificate che consente di eseguire funzioni di aggregazione su colonne non raggruppate (come SUM, COUNT, AVG, ecc.).


130
Questa affermazione non ha praticamente alcun senso senza un esempio di accompagnamento.
JohnMerlino

2
Penso che il secondo esempio nella pagina nel link sia sufficiente per capire la differenza tutorialspoint.com/sql/sql-group-by.htm
nishantbhardwaj2002

Puoi fornire un esempio?
Rice

249

ORDER BY altera l'ordine in cui gli articoli vengono restituiti.

GROUP BY aggregherà i record in base alle colonne specificate che consente di eseguire funzioni di aggregazione su colonne non raggruppate (come SUM, COUNT, AVG, ecc.).

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

2
Cosa succede se la tabella ha una agecolonna, con Peters che ha età diverse e la query è SELEZIONA NOME, ETÀ DA TABELLA GRUPPO PER NOME?
Varun

1
Non puoi restituire colonne che non fanno parte del tuo gruppo o che hanno un metodo. Quindi dovresti aggiungere l'età al gruppo o fare qualcosa come Max (Age).
RiddlerDev

78

ORDINA PER: ordina i dati in ordine crescente o decrescente.

Considera la tabella CLIENTI :

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

Di seguito è riportato un esempio, che ordinerebbe il risultato in ordine crescente per NOME:

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME;

Ciò produrrebbe il seguente risultato:

+----+----------+-----+-----------+----------+
| 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: organizza dati identici in gruppi.

Ora, la tabella CLIENTI ha i seguenti record con nomi duplicati:

+----+----------+-----+-----------+----------+
| 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 si desidera raggruppare nomi identici in un unico nome, la query GROUP BY sarà la seguente:

SQL> SELECT * FROM CUSTOMERS
     GROUP BY NAME;

Ciò produrrebbe il seguente risultato: (per nomi identici selezionerebbe l'ultimo e infine ordinerebbe la colonna in ordine 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 |
    +----+----------+-----+-----------+----------+

come hai dedotto che non è di alcuna utilità senza le funzioni SQL come sum, avg ecc ..

quindi segui questa definizione per capire l'uso corretto di GROUP BY:

Una clausola GROUP BY funziona sulle righe restituite da una query riassumendo righe identiche in un gruppo singolo / distinto e restituisce una singola riga con il riepilogo per ciascun gruppo, utilizzando la funzione Aggregate appropriata nell'elenco SELECT, come COUNT (), SUM (), MIN (), MAX (), AVG (), ecc.

Ora, se desideri conoscere l'importo totale dello stipendio su ciascun cliente (nome), la query GROUP BY sarà la seguente:

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

Ciò produrrebbe il seguente risultato: (somma degli stipendi di nomi identici e ordina la colonna NOME dopo aver rimosso nomi identici)

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

25

La differenza è esattamente ciò che suggerisce il nome: un gruppo per esegue un'operazione di raggruppamento e un ordine per ordinamenti.

Se lo fai SELECT * FROM Customers ORDER BY Name, ottieni l'elenco dei risultati ordinato in base al nome del cliente.

Se SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActiveottieni un conteggio dei clienti attivi e inattivi. Il gruppo ha aggregato i risultati in base al campo specificato.


3
Inoltre: se GRUPPI, i risultati non sono necessariamente ordinati; sebbene in molti casi possano uscire in un ordine intuitivo, ciò non è garantito dalla clausola GROUP. Se vuoi che i tuoi gruppi siano ordinati, usa sempre un ORDER BY esplicito dopo GROUP BY.
Dave Costa

16

Hanno un significato completamente diverso e non sono affatto correlati.

ORDER BY consente di ordinare il set di risultati in base a criteri diversi, ad esempio prima l'ordinamento per nome da az, quindi l'ordinamento in base al prezzo dal più alto al più basso.

(ORDINA PER nome, prezzo DESC)

GROUP BY consente di prendere il set di risultati, raggrupparlo in gruppi logici e quindi eseguire query aggregate su quei gruppi. Ad esempio, puoi selezionare tutti i dipendenti, raggrupparli in base alla posizione di lavoro e calcolare lo stipendio medio di tutti i dipendenti di ciascuna sede di lavoro.


8

Semplice, ORDER BYordina i dati e GROUP BYraggruppa o combina i dati.

ORDER BY ordina il set di risultati come da campo citato, per impostazione predefinita in ordine crescente.

Supponiamo che tu stia attivando una query come ORDER BY (student_roll_number), ti mostrerà il risultato in ordine crescente dei numeri del rotolo dello studente. In questo caso, l' student_roll_numberimmissione potrebbe verificarsi più di una volta.

Nel GROUP BYcaso, lo usiamo con le funzioni aggregate e raggruppa i dati secondo la funzione aggregata e otteniamo il risultato. Qui, se la nostra query ha SUM (marks)insieme ad GROUP BY (student_first_name)essa, mostrerà la somma dei voti degli studenti appartenenti a ciascun gruppo (dove tutti i membri di un gruppo avranno lo stesso nome).


4

GROUP BY viene utilizzato per raggruppare righe in una selezione, di solito durante l'aggregazione di righe (ad esempio, calcolo di totali, medie, ecc. Per un insieme di righe con gli stessi valori per alcuni campi).

ORDER BY viene utilizzato per ordinare le righe risultanti da un'istruzione select.



1

ORDER BYmostra un campo in ordine crescente o decrescente. Mentre GROUP BYmostra gli stessi nomi di campo, ID ecc in un solo output.


4
Questa risposta non fornisce alcuna informazione aggiuntiva che la risposta accettata, o qualsiasi altra risposta data, non dichiari già.
newfurniturey

1
  1. GROUP BY aggregherà i record in base alla colonna specificata che consente di eseguire funzioni di aggregazione su colonne non raggruppate (come SUM, COUNT, AVG, ecc.). ORDER BY altera l'ordine in cui gli articoli vengono restituiti.
  2. Se selezioni SELEZIONA IsActive, COUNT (*) FROM Customers GROUP BY IsActive ottieni un conteggio dei clienti attivi e inattivi. Il gruppo ha aggregato i risultati in base al campo specificato. Se selezioni SELEZIONA * DA Clienti ORDINA PER Nome, otterrai l'elenco dei risultati ordinato in base al nome del cliente.
  3. Se GRUPPI, i risultati non sono necessariamente ordinati; sebbene in molti casi possano uscire in un ordine intuitivo, ciò non è garantito dalla clausola GROUP. Se vuoi che i tuoi gruppi siano ordinati, usa sempre un ORDER BY esplicito dopo GROUP BY.
  4. I dati raggruppati non possono essere filtrati dalla clausola WHERE. I dati dell'ordine possono essere filtrati dalla clausola WHERE.

0

Va notato che GROUP BYnon è sempre necessario in quanto (almeno in PostgreSQL e probabilmente in altre varianti SQL) puoi usare ORDER BYcon un elenco e puoi ancora usare ASCo DESC per colonna ...

SELECT name_first, name_last, dob 
FROM those_guys 
ORDER BY name_last ASC, name_first ASC, dob DESC;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.