Ordinamenti e raggruppamenti in linguaggio SQL
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, funzione e livello:
SELECT Cognome, Nome, Funzione, Livello
FROM Personale
ORDER BY Cognome, Nome;
L'ordinamento viene fatto su due attributi: a parita 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 parita di stipendio, in ordine di cognome:
SELECT Cognome, Stipendio
FROM Personale
ORDER BY Stipendio 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 (Stipendio), COUNT(*)
FROM 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;
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(Stipendio)
FROM Personale
GROUP BY Funzione
HAVING COUNT(*) > 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.
Condizioni di ricerca in linguaggio SQL
Le condizioni di ricerca sono utilizzate insieme alle clausole WHERE e HAVING per determinare i criteri di selezione rispettivamente delle righe e dei raggruppamenti.
Nella scrittura delle condizioni si usano i segni del confronto =, <, >, <>, >=, <=.
Una condizione di ricerca è costruita anche mettendo insieme più condizioni
legate tra loro con gli operatori AND e OR,
precedute eventualmente dall’operazione NOT.
L’ordine di applicazione degli operatori è il seguente: NOT
viene applicato prima di AND e AND
prima di OR.
Le condizioni di ricerca possono utilizzare anche altre parole del linguaggio SQL che indicano operatori o predicati, con i quali è possibile rendere ancora più raffinate le interrogazioni alla base di dati.
BETWEEN
L’operatore BETWEEN controlla se un valore è compreso
all'interno di un intervallo di valori, inclusi gli estremi. E' possibile
specificare, anteponendolo a BETWEEN, anche l’operatore
logico NOT per valutare la condizione opposta, cioè
per controllare se il valore non rientra nell'intervallo specificato.
Per ottenere l’elenco dei dipendenti (con cognome, nome, funzione) che sono stati assunti tra la data 1/1/95 e la data 31/12/99, si può usare la parola BETWEEN nella scrittura della condizione dopo WHERE:
SELECT Cognome, Nome, Funzione
FROM Personale
WHERE Assunto BETWEEN 01/01/95 AND 12/31/99;
IN
L'operatore IN controlla se un valore appartiene
ad un insieme specificato di valori, cioè è possibile richiedere le righe
che hanno i valori di un attributo compresi in una lista di valori indicati
dopo la parola IN all’interno della condizione scritta
dopo WHERE.
Per ottenere tutti i dati dei dipendenti che risiedono nelle province di Milano, Mantova, Brescia e Como, si usa il comando SELECT nella forma:
SELECT *
FROM Personale
WHERE Prov IN ('MI','MN','BS','CO');
Anche IN può essere preceduto da NOT per indicare la condizione opposta, cioè la non appartenenza del valore all'insieme dei valori.
LIKE
L'operatore LIKE confronta il valore di un attributo
di tipo carattere con un modello di stringa che puo contenere caratteri
jolly (o metacaratteri).
I caratteri jolly sono:
_ (underscore) per indicare un singolo carattere qualsiasi in quella posizione della stringa;
% (percento) per indicare una sequenza qualsiasi di caratteri in quella posizione della stringa.
Per esempio:
LIKE 'xyz%' vengono ricercate tutte le stringhe che iniziano con i caratteri 'xyz' ;
LIKE '%xyz' serve a ricercare tutte le stringhe che finiscono con i caratteri 'xyz' ;
LIKE '%xyz%' per tutte le stringhe che contengono al loro interno i caratteri 'xyz';
LIKE '_xyz' controlla le stringhe di 4 caratteri che finiscono con 'xyz'.
L'operatore LIKE utilizzato con un modello di stringa che non contiene caratteri jolly è del tutto equivalente all’operatore =.
Con il comando SELECT scritto nella forma seguente, è possibile ottenere il cognome e la filiale dei dipendenti con il cognome che inizia con 'Ros' (Rossi, Rosetti, Rossini,...):
SELECT Cognome, Filiale
FROM Personale
WHERE Cognome LIKE 'Ros%';
Anche in questo caso si può usare l’operatore NOT prima di LIKE per indicare criteri di ricerca opposti.
IS NULL
Il predicato IS NULL confronta il valore in una colonna
con il valore Null. Luso di questo predicato è il
solo modo per controllare la presenza del valore Null
in una colonna.
E possibile inserire l'operatore di negazione NOT
per valutare la condizione opposta, in altre parole per controllare se un
attributo non ha valore Null.
L'operatore IS viene utilizzato solo con la parola Null.
Per esempio se si vuole ottenere l'elenco con cognome e nome dei dipendenti
per i quali è indicata la provincia nella tabella Personale,
si deve scrivere la seguente istruzione Select:
SELECT Cognome, Nome
FROM Personale
WHERE Prov IS NOT NULL;
Pagine correlate:
edutecnica