giovedì 27 novembre 2008

Approfondimenti su SQL: clausole where, having e group by

Tra le clausole utilizzate con l'istruzione SELECT meritano particolare attenzione:


- La clausola WHERE ha la finalità di limitare le selezioni ed includere solo le righe che corrispondono ai criteri specificati. La sua sintassi è molto semplice:

WHERE campo_predicato_valore


Il termine campo naturalmente si riferisce al nome di un campo presente in una delle origini, il predicato, invece, si riferisce ai simboli che stabiliscono una regola rispetto ai valori specificati e può essere uno dei seguenti:


= è uguale al valore;
< è minore del valore;

> è maggiore del valore;
<= è minore oppure uguale al valore;

>= è maggiore oppure uguale al valore;
<> è differente dal valore;
LIKE è similare al valore;
NOT LIKE non è similare al valore;
BETWEEN è compreso tra i due valori specificato a seguito;
NOT BETWEEN non è compreso tra i due valori;
IS NULL è il valore NULL;
IS NOT NULL non è il valore NULL.



Alcuni database consentono l'uso di ulteriori predicati:


!= non è uguale (cioè è differente) al valore;
!<>

!> non è maggiore (cioè è minore o uguale) del valore;
IN corrisponde ad uno dei valori specificati di seguito;
NOT IN non corrisponde ad alcuno dei valori specificati a seguito.



CHIARIMENTI:

  1. I campi numerici vanno indicati con valori numerici come 1, 2, 3 o 40000.
  2. I campi di testo vanno indicati con valori di testo, quindi stringhe racchiuse dal carattere di apostrofo come 'casa mia' o 'pippo'. La regola comune stabilisce che le ricerche su campi di testo sono effettuate ignorando le differenze tra maiuscolo e minuscolo (case insensitive).
  3. Gli altri tipi di campo (data, caratteri unicode, o altro genere) vanno verificati con i simboli decisi dal singolo driver del database.


ESEMPI:

Supponiamo di avere una tabella Dipendenti e di essere interessati a conoscere tutti i nomi dei dipendenti che abbiano un'età inferiore ai 48 anni. La sintassi sarà la seguente:


SELECT nome, cognome

FROM dipendenti

WHERE anno_nascita > 1960


Questa sintassi restituirà due campi di quelle righe in cui il campo anno_nascita contiene un valore superiore a 1960. Come si nota, il campo specificato nell'operatore WHERE non deve necessariamente essere presente nell'elenco dei campi restituiti.


O ancora...


SELECT nome, cognome

FROM dipendenti

WHERE anno_nascita BETWEEN 1960 AND 1980


In questo caso la sintassi restituirà il nome e cognome dei dipententi di età compresa tra 48 e 28 anni.




- La clausola ORDER BY. Potrebbe capitare che si abbia la necessità di presentare i risultati di una query in un certo ordine, la clausola ORDER BY assolve a questo scopo. Anche in questo caso la sintassi è molto semplice:


SELECT elenco campi

FROM nome_tabella

ORDER BY campi_chiave


ESEMPIO:

Immaginiamo di avere una tabella Studenti, contenete campi come: nome, cognome, matricola, data_immatricolazione e media_voti, di essere interessati a conoscere il cognome degli studenti, la media dei voti conseguita e la data di immatricolazione e di avere la necessità che questi risultati siano ordinati per data di immatricolazione. La sintassi sarebbe la seguente:


SELECT cognome, media_voti, data_immatricolazione

FROM studenti

ORDER BY data_immatricolazione


- La clausola HAVING rappresenta un vincolo sui dati risultanti dall'operazione di raggruppamento. Il suo funzionamento è molto simile a quello della clausola WHERE ma anziché operare sui campi del database opera sui raggruppamenti; i campi richiesti possono essere sia quelli delle funzioni di aggregazione sia quelli indicati nelle clausole GROUP BY.


SELECT elenco_campi
FROM nome_tabella
WHERE criteri_selezione
GROUP BY elenco_campigruppo
HAVING criteri_gruppo


ESEMPIO:

Immaginiamo di avere una tabella Dipendenti, contenente, oltre ai campi inerenti ai dati anagrafici, campi come ruolo e stipendio. Supponiamo di essere interessati a conoscere quanti dipendenti occupanti un determinato ruolo percepiscono uno stipendio superiore a 1500. La sintassi sarà la seguente:


SELECT ruolo, stipendio,

COUNT stipendio

FROM dipendenti

GROUP BY stipendio HAVING COUNT stipendio > 1500

Nessun commento: