📁
Forum per Webmaster
SQL

Ordinamenti e raggruppamenti

Nel comando Select si può inserire la clausola ORDER BY per ottenere i risultati di un’interrogazione ordinati secondo i valori contenuti in una o più colonne, tra quelle elencate accanto alla parola Select. L’ordinamento può essere crescente (le stringhe dalla A alla Z e i numeri dal minore al maggiore) oppure decrescente (le stringhe dalla Z alla A e i numeri dal maggiore al minore): i due tipi di ordinamento sono specificati usando rispettivamente le parole chiave ASC per crescente e DESC per decrescente.
L'ordinamento è crescente per default e va specificata la parola Desc solo se si desidera l'ordinamento decrescente. Il seguente esempio produce in output l'elenco alfabetico dei dipendenti, con cognome, nome, codice fiscale e data di nascita:

SELECT Cognome, Nome, CodFisc, Nascita
 FROM Personale
 ORDER BY Cognome, Nome;

L’ordinamento viene fatto su due attributi: a parità di cognome i dipendenti vengono ordinati per nome. Se i tipi di ordinamento richiesti riguardano più attributi e sono diversi, occorre aggiungere la parola Desc accanto agli attributi per i quali si vuole l'ordinamento decrescente. L'esempio seguente serve a produrre l'elenco dei dipendenti in ordine decrescente di stipendio base e, a parità di stipendio, in ordine di cognome:

SELECT Cognome, StipBase
 FROM Personale
 ORDER BY StipBase DESC, Cognome;

La clausola Order By è in genere l'ultimo elemento di un comando SQL. Negli ordinamenti il valore Null compare all'inizio delle sequenze crescenti e alla fine delle sequenze decrescenti. Con l'uso delle funzioni di aggregazione è possibile estendere la struttura del comando Select con l'aggiunta della clausola GROUP BY per raggruppare un insieme di righe aventi lo stesso valore nelle colonne indicate: questa opzione produce una riga di risultati per ogni raggruppamento. Se nel comando viene inserita una funzione di aggregazione, come Sum o Count, per ciascuna riga della tabella risultante viene prodotto un valore di raggruppamento. Il comando seguente serve ad ottenere la lista delle funzioni dei dipendenti con la somma degli stipendi e il numero dei dipendenti appartenenti alle diverse funzioni:

SELECT Funzione, SUM (StipBase), COUNT(*)
 FRON Personale
 GROUP BY Funzione;

Le righe aventi lo stesso valore nella colonna o nelle colonne specificate sono concettualmente organizzate in gruppi di righe, producendo una sola riga di risultati per ogni gruppo. Se l'istruzione Select non contiene una funzione di aggregazione di SQL, i valori di raggruppamento non vengono prodotti in output. I valori Null vengono raggruppati ma non vengono valutati da nessuna delle funzioni di aggregazione ad eccezione di Count(*). Se si utilizza una clausola Group By, tutti gli attributi che compaiono nella lista accanto alla parola Select devono essere inclusi nella clausola Group By oppure devono essere argomenti di una funzione di aggregazione. Il seguente esempio produce l'elenco dei livelli esistenti tra i dipendenti che svolgono la funzione di Impiegato con il numero di dipendenti per ciascun livello:

SELECT Livello, COUNT (Livello) AS Conteggio
 FROM Personale
 WHERE Funzione 'Impiegato'
 GROUP BY Livello;

La struttura del comando Select con raggruppamenti può essere ulteriormente ampliata con la clausola HAVING con la quale è possibile sottoporre al controllo di una o più condizioni i gruppi creati con la clausola Group by.
La condizione scritta dopo Having normalmente controlla il valore restituito dalle funzioni di aggregazione (Count, Sum, Avg, Min, Max). Il seguente esempio presenta l'uso del comando Select per ottenere la lista delle funzioni dei dipendenti con lo stipendio medio per ciascuna funzione, dopo aver raggruppato i dipendenti per funzione, purché i dipendenti con quella funzione siano più di 2:

SELECT Funzione, AVG(StipBase)
 FRON Personale
 GROUP BY Funzione
 HAVING COUN(*) 2;

In genere quindi la clausola Having viene usata insieme a Group By: dopo che Group By ha formato i raggruppamenti di righe, Having serve a visualizzare le righe di raggruppamento che soddisfano alle condizioni scritte accanto a Having. Se l'istruzione Select contiene la clausola Where, i valori vengono raggruppati dopo aver operato la selezione sulle righe che rispettano le condizioni scritte accanto a Where. Con il seguente comando si ottiene l'elenco delle filiali nelle quali ci sono più di 10 impiegati:

SELECT Filiale, COUNT (Filiale) AS Conteggio
 FROM Personale
 WHERE Funzione 'Impiegato'
 GROUP BY Filiale
 HAVING COUNT(*) 10;

La clausola Having presenta caratteristiche analoghe alla clausola Where, ma agisce in modo differente: con Where vengono poste condizioni sulle righe della tabella, con Having il controllo delle condizioni viene fatto sui risultati delle funzioni di aggregazione applicate a gruppi di righe.

Argomenti nella stessa categoria