Il Filtraggio dei Dati Avanzato in MySQL
Vediamo ora il filtraggio dati avanzato MySQL e quali operatori possiamo utilizzare.
Combinazione di clausole WHERE
Tutti gli esempi presentati nell’articolo precedente filtravano i dati usando una sola condizione; per un maggior livello di controllo sul filtraggio dei dati, MySQL consente di utilizzare più clausole WHERE per utilizzare tali clausole in due modi: come clausole AND od OR.
Utilizzo dell’operatore AND
Per poter filtrare più colonne possiamo utilizzare l’operatore AND da aggiungere alla clausola WHERE , l’esempio seguente ne illustra il funzionamento:
SELECT prod_id,prod_prezzo,prod_nome FROM prodotti WHERE vend_id=1003 AND prod_prezzo;
L’espressione SQL appena illustrata recupera il nome e il prezzo di tutti i prodotti del venditore 1003 che abbiano un prezzo minore o uguale a 10.
La clausola WHERE nell’espressione SELECT è composta da due condizioni, per unirli viene utilizzata la parola chiave AND; che chiede al DBMS di recuperare solo le righe che soddisfano tutte le condizioni specificate.
Se un prodotto appartiene al venditore 1003 ma ha un prezzo superiore a 10, non viene recuperato.
Allo stesso modo non vengono recuperati i prodotti con un costo minore o uguale a 10 appartenenti a un rivenditore diverso da quello specificato.
Bisogna ricordarsi che con l’operatore AND è possibile specificare anche altre condizioni di filtraggio, ciascuna separata da una parola chiave AND.
Utilizzo dell’operatore OR
L’operatore OR è l’esatto opposto di AND, l’operatore OR chiede a MySQL di recuperare le righe che soddisfano almeno una condizione.
Guardiamo il seguente esempio:
SELECT prod_prezzo,prod_nome FROM prodotti WHERE vend_id=1002 OR vend_id=1003;
L’espressione SQL qui sopra recupera il nome e il prezzo dei prodotti appartenenti a uno dei due rivenditori specificati; l’operatore OR chiede al DBMS di soddisfare almeno una condizione, non entrambe.
Se in questo caso fosse stato utilizzato un operatore AND non sarebbe stato recuperato alcun dato.
Ordine di valutazione delle condizioni
Le clausole WHERE possono contenere un numero qualsiasi di operatori AND o OR, la cui combinazione consente di eseguire filtraggi sofisticati e complessi.
La combinazione degli operatori AND e OR, presenta però un problema, che illustreremo con una semplice query di esempio.
Immaginiamo di avere necessità di un elenco di tutti i prodotti con un prezzo maggiore di 20 forniti dai rivenditori 1002 e 1103:
SELECT prod_id,prod_prezzo,prod_nome FROM prodotti WHERE vend_id=1002 OR vend_id=1003 AND prod_prezzo>=20;
SQL elabora gli operatori AND prima di quelli OR, quando SQL riceve la clausola WHERE precedente, recupera i prodotti finiti dal rivenditore 1002 indipendentemente dal suo prezzo e qualsiasi altro prodotto con un costo maggiore o uguale a 20 fornito dal rivenditore 1003.
In altre parole, poiché nell’ordine di valutazione la priorità AND è maggiore, sono stati messi insieme gli operatori sbagliati; la soluzione a questo problema è rappresentata dall’utilizzo delle parentesi per raggruppare in modo esplicito gli operatori correlati:
SELECT prod_id,prod_prezzo,prod_nome FROM prodotti WHERE (vend_id=1002 OR vend_id=1003) AND prod_prezzo>=20;
Con le parentesi cambia tutto, infatti hanno un ordine di valutazione superiore rispetto agli operatori AND od OR, il DBMS filtra prima la condizione OR tra parentesi.
Utilizzo dell’operatore IN
Nella clausola WHERE le parentesi hanno un’altra funzione molto diversa.
L’operatore IN serve a specificare un intervallo di condizioni, ciascuna delle quali è valida; accetta un elenco di valori validi delimitati da virgole, tutte racchiusi tra parentesi.
Ecco un esempio:
SELECT prod_prezzo,prod_nome FROM prodotti WHERE vend_id IN (1002,1003) ORDER BY prod_nome;
I vantaggi di utilizzare l’operatore IN sono:
- quando si lavora con un lungo elenco di opzioni valide, la sintassi dell’operatore IN è molto più semplice e facile da leggere.
- quando si utilizza IN, l’ordine di valutazione è più facile da gestire , infatti vengono utilizzati meno operatori
- gli operatori IN vengono elaborati quasi sempre molto più velocemente di elenchi di operatori OR
- il vantaggio maggiore di IN è rappresentato dal fatto che l’operatore IN contiene un’altra espressione SELECT, che consente di costruire clausole WHERE molto dinamiche.
Utilizzo dell’operatore NOT
L’operatore NOT della clausola WHERE ha una sola funzione: nega qualunque condizione lo segua.
Esempio:
SELECT prod_prezzo,prod_nome FROM prodotti WHERE vend_id NOT IN (1002,1003) ORDER BY prod_nome;
Perché utilizzare NOT?
Di fatto per le clausole WHERE semplici, l’utilizzo di NOT non presenta alcun vantaggio; l’utilità di NOT diventa evidente in query più complesse come per esempio utilizzando NOT insieme all’operatore IN si semplifica la ricerca di tutte le righe che non soddisfano un elenco di condizioni.
MySQL supporta l’utilizzo di NOT per negare clausole IN,BETWEEN e EXISTS.
Tale situazione è molto diversa dalla maggior parte degli altri DBMS che consentono l’utilizzo di NOT per negare qualsiasi condizione.