Gran parte della potenza dei database relazionali deriva dal filtraggio dei dati e dall'unione di tabelle. Questo è il motivo per cui rappresentiamo queste relazioni in primo luogo. Ma i moderni sistemi di database forniscono un'altra tecnica preziosa: il raggruppamento.
Il raggruppamento consente di estrarre informazioni di riepilogo da un database. Consente di combinare i risultati per creare dati statistici utili. Il raggruppamento ti evita di scrivere codice per casi comuni come la media di elenchi di cifre. E può creare sistemi più efficienti.
Cosa fa la clausola GROUP BY?
GROUP BY, come suggerisce il nome, raggruppa i risultati in un insieme più piccolo. I risultati sono costituiti da una riga per ogni valore distinto della colonna raggruppata. Possiamo mostrarne l'utilizzo osservando alcuni dati di esempio con righe che condividono alcuni valori comuni.
Quello che segue è un database molto semplice con due tabelle che rappresentano gli album dei record. È possibile configurare un database di questo tipo tramite
scrivere uno schema di base per il sistema di database scelto. Il album tabella ha nove righe con una chiave primaria id colonna e colonne per nome, artista, anno di uscita e vendite:++++++
| id | nome | artist_id | release_year | vendite |
++++++
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | Il lato oscuro della luna | 2 | 1973 | 24 |
| 3 | Voci | 3 | 1977 | 28 |
| 4 | Non importa | 4 | 1991 | 17 |
| 5 | Animali | 2 | 1977 | 6 |
| 6 | Arrivederci Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Pipistrello fuori dall'inferno | 7 | 1977 | 28 |
++++++
Il artisti la tabella è ancora più semplice. Ha sette righe con colonne id e nome:
+++
| id | nome |
+++
| 1 | I Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Polpettone |
+++
Puoi comprendere vari aspetti di GROUP BY con un semplice set di dati come questo. Ovviamente, un set di dati della vita reale avrebbe molte, molte più righe, ma i principi rimangono gli stessi.
Raggruppamento per una singola colonna
Supponiamo di voler scoprire quanti album abbiamo per ogni artista. Inizia con un tipico SELEZIONARE query per recuperare la colonna artist_id:
SELEZIONA artist_id DAGLI album
Restituisce tutte e nove le righe, come previsto:
++
| artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
++
Per raggruppare questi risultati in base all'artista, aggiungi la frase GROUP BY artist_id:
SELEZIONA artist_id DAGLI album GROUP BY artist_id
Che dà i seguenti risultati:
++
| artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
++
Ci sono sette righe nel set di risultati, ridotte dalle nove totali in album tavolo. Ciascuno unico artist_id ha una sola riga. Infine, per ottenere i conteggi effettivi, aggiungi CONTARE(*) alle colonne selezionate:
SELEZIONA artist_id, COUNT (*)
DA album
GROUP BY artist_id
+++
| artist_id | CONTE (*) |
+++
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+++
I risultati raggruppano due coppie di righe per gli artisti con ID 2 e 6. Ognuno ha due album nel nostro database.
Relazionato: Il foglio illustrativo dei comandi SQL essenziali per principianti
Come accedere ai dati raggruppati con una funzione aggregata
Potresti aver usato il file CONTARE funzione prima, in particolare in CONTARE(*) forma come visto sopra. Recupera il numero di risultati in un set. Puoi usarlo per ottenere il numero totale di record in una tabella:
SELEZIONA COUNT (*) DAGLI album
++
| CONTE (*) |
++
| 9 |
++
COUNT è una funzione aggregata. Questo termine si riferisce a funzioni che traducono valori da più righe in un singolo valore. Sono spesso usati insieme all'istruzione GROUP BY.
Invece di contare semplicemente il numero di righe, possiamo applicare una funzione aggregata ai valori raggruppati:
SELEZIONA artist_id, SUM (vendite)
DA album
GROUP BY artist_id
+++
| artist_id | SOMMA (vendite) |
+++
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+++
Le vendite totali mostrate sopra per gli artisti 2 e 6 sono le vendite dei loro album multipli combinate:
SELEZIONA artist_id, vendite
DA album
WHERE artist_id IN (2, 6)
+++
| artist_id | vendite |
+++
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+++
Raggruppamento per più colonne
Puoi raggruppare per più di una colonna. Basta includere più colonne o espressioni, separate da virgole. I risultati verranno raggruppati in base alla combinazione di queste colonne.
SELEZIONA release_year, sales, count (*)
DA album
GROUP BY release_year, vendite
Ciò produrrà in genere più risultati rispetto al raggruppamento per una singola colonna:
++++
| release_year | vendite | conteggio (*) |
++++
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
++++
Nota che, nel nostro piccolo esempio, solo due album hanno lo stesso anno di uscita e conteggio delle vendite (28 nel 1977).
Utili funzioni aggregate
Oltre a COUNT, diverse funzioni funzionano bene con GROUP. Ogni funzione restituisce un valore basato sui record appartenenti a ciascun gruppo di risultati.
- COUNT () restituisce il numero totale di record corrispondenti.
- SOMMA () restituisce il totale di tutti i valori nella colonna data sommati.
- MIN () restituisce il valore più piccolo in una data colonna.
- MAX () restituisce il valore più grande in una data colonna.
- AVG () restituisce la media media. È l'equivalente di SUM () / COUNT ().
È inoltre possibile utilizzare queste funzioni senza una clausola GROUP:
SELEZIONA AVG (vendite) DAGLI album
++
| AVG (vendite) |
++
| 19.1111 |
++
Utilizzo di GROUP BY con una clausola WHERE
Proprio come con un normale SELECT, puoi ancora usare WHERE per filtrare il set di risultati:
SELEZIONA artist_id, COUNT (*)
DA album
WHERE release_year> 1990
GROUP BY artist_id
+++
| artist_id | CONTE (*) |
+++
| 4 | 1 |
| 6 | 2 |
+++
Ora hai solo quegli album pubblicati dopo il 1990, raggruppati per artista. Puoi anche utilizzare un join con la clausola WHERE, indipendentemente da GROUP BY:
SELEZIONA r.name, COUNT (*) COME album
Dagli album l, artisti r
WHERE artist_id = r.id
AND release_year> 1990
GROUP BY artist_id
+++
| nome | album |
+++
| Nirvana | 1 |
| Adele | 2 |
+++
Tieni presente, tuttavia, che se provi a filtrare in base a una colonna aggregata:
SELEZIONA r.name, COUNT (*) COME album
Dagli album l, artisti r
WHERE artist_id = r.id
E album> 2
GROUP BY artist_id;
Riceverai un errore:
ERRORE 1054 (42S22): colonna "album" sconosciuta in "clausola where"
Le colonne basate sui dati aggregati non sono disponibili per la clausola WHERE.
Utilizzo della clausola HAVING
Quindi, come si filtra il set di risultati dopo che è stato effettuato un raggruppamento? Il AVERE la clausola si occupa di questa esigenza:
SELEZIONA r.name, COUNT (*) COME album
Dagli album l, artisti r
WHERE artist_id = r.id
GROUP BY artist_id
AVERE album> 1;
Si noti che la clausola HAVING viene dopo GROUP BY. Altrimenti, è essenzialmente una semplice sostituzione di WHERE con HAVING. I risultati sono:
+++
| nome | album |
+++
| Pink Floyd | 2 |
| Adele | 2 |
+++
È comunque possibile utilizzare una condizione WHERE per filtrare i risultati prima del raggruppamento. Funzionerà insieme a una clausola HAVING per il filtraggio dopo il raggruppamento:
SELEZIONA r.name, COUNT (*) COME album
Dagli album l, artisti r
WHERE artist_id = r.id
AND release_year> 1990
GROUP BY artist_id
AVERE album> 1;
Solo un artista nel nostro database ha pubblicato più di un album dopo il 1990:
+++
| nome | album |
+++
| Adele | 2 |
+++
Combinazione di risultati con GROUP BY
L'istruzione GROUP BY è una parte incredibilmente utile del linguaggio SQL. Può fornire informazioni di riepilogo dei dati, ad esempio per una pagina dei contenuti. È un'ottima alternativa al recupero di grandi quantità di dati. Il database gestisce bene questo carico di lavoro extra poiché il suo stesso design lo rende ottimale per il lavoro.
Una volta compreso il raggruppamento e come unire più tabelle, sarai in grado di utilizzare la maggior parte della potenza di un database relazionale.
Scopri come utilizzare i join SQL per semplificare le query, risparmiare tempo e farti sentire un utente esperto di SQL.
- Programmazione
- SQL
Bobby è un appassionato di tecnologia che ha lavorato come sviluppatore di software per quasi due decenni. È appassionato di giochi, lavora come revisore per Switch Player Magazine ed è immerso in tutti gli aspetti dell'editoria online e dello sviluppo web.
Iscriviti alla nostra Newsletter
Iscriviti alla nostra newsletter per suggerimenti tecnici, recensioni, ebook gratuiti e offerte esclusive!
Ancora un passo…!
Conferma il tuo indirizzo e-mail nell'e-mail che ti abbiamo appena inviato.