Where
WHERE serve a definire il criterio di selezione dei record chedevono essere rintracciati da SELECT.
Se avessimo una tavola XYZ deltipo:
NOME DATA IMPORTO
---------------------------
Rossi 12/03/89 120.000
Bianchi 13/03/89
Verdi 13/03/89 22.00
applicando
SELECT NOME FROM XYZ WHERE IMPORTO < 100.000;
avremmocome risultato
NOME
-------
Bianchi
Verdi
In pratica diremmo di selezionaredalla tavola XYZ i campi NOME dei record che hanno il campoIMPORTO minore di 100.000.
Le condizioni ammesse sono:
+---------------------+---------+
| Condizione |Simbolo |
+---------------------+---------+
| Uguale | = |
| Parzialmente uguale | LIKE |
| Maggiore | > |
| Minore | < |
| Maggiore o uguale |
| Minore o uguale | <= |
| Diverso | <> |
| Compreso tra |BETWEEN |
| Negazione | NOT |
| Uguale a uno della |
| lista (*) | IN |
+---------------------+---------+
Le varie condizioni usate con WHEREpossono essere collegate tra loro mediante operatorilogici.
In altre parole potremmo crearecostrutti del tipo:
SELECT NOME FROM XYZ WHERE IMPORTO < 100.000 AND IMPORTO > 30.000;
oppure
SELECT NOME FROM XYZWHERE NOME < 'Mario' AND IMPORTO >= 100.000;
e ancora
SELECT NOME, COGN, INDIR FROM XYZ WHERE PROVINCIA = 'Alessandria' OR DATA < '02-JAN-89';
E' possibile combinare clausole OR con quelle di AND utilizzandoanche anche le parentesi rotonde contemplate dal linguaggioSQL.
SELECT NOME, COGN, INDIR FROM XYZ WHERE (CITTA = 'Asti' AND IMPORTO < 100.000) OR CITTA = 'Pavia';
Penso che non ci sia da aggiungerealtro per quanto riguarda glioperatori per imbastire le condizioni quali <, >, >=ecc.
Alcune spiegazioni devono essere riportate invece sulle condizioni tipo LIKE, BETWEEN eIN.
Procediamo con ordine.
Mediante la specifica LIKE e' possibile creare costrutti del tipo:
SELECT NOME, COGN FROM XYZ WHERE COGN LIKE 'Rossi';
Utilizzare la LIKE comenell'esempio precedente e' come fare
SELECT NOME, COGN FROM XYZWHERE COGN = 'Rossi';
La vera potenza di LIKE sta'nella possibilita' di utilizzare due tipi di caratteri jolly per testare delleuguaglianze parziali.
I due caratteri sono precisamente '%'
Il primopuo' valere uno o piu' caratteri mentre il secondopuo' sostituirne uno solo.
Supponendo di avere una tavolacon:
DITTA CITTA' P.IVA
--------------------------------------
Bolognini Alessandria 01234567823
Bolognesi Firenze 02334432345
Bologna Milano
Bognardi Roma 01212121212
potremmo dare
SELECT DITTA FROM XYZ WHERE DITTA LIKE '%ogn%';
In questo caso avremmovisualizzato
DITTA
---------
Bolognini
Bolognesi
Bologna
Bognardi
Il comando
SELECT DITTA FROM XYZ WHERE DITTA LIKE '_ogn%';
visualizzerebbe
DITTA
---------
Bognardi
e ancora
SELECT DITTA FROM XYZ WHERE DITTA LIKE '%ogn___';
darebbe come risultato
DITTA
---------
Bolognini
Bolognesi
Sono anche possibili costrutti deltipo
SELECT DITTA FROM XYZ WHERE DITTA LIKE 'B%';SELECT DITTA FROM XYZ WHERE DITTA LIKE '____';
Potrebbe verificarsi il caso in cuii caratteri '_' o '%' facciano parte di quello che si vuolericercare.
Prendete ad esempio una tavola deltipo:
FLAGS FUNCTION
----------------------
O_RDONLY open
O_RDWR open
P_WAIT spawn
P_NOWAIT spawn
Per fare in modo che il carattere'_' non venga interpretato come carattere jolly bisogna farlo precedere da uncarattere d'escape. SQL definito dall' ANSIdispone della specifica ESCAPE da unire con LIKE per stabilire il carattered'escape.
SELECT * FROM XYZ WHERE FLAGS LIKE 'O\_R%' ESCAPE '';
In questo caso '' viene interpretato da SQL come
Un altro operatore relazionaleatipico (rispetto a <, >ecc.) e' IN.
Mediante IN e' possibile specificare una lista di valori
Un costrutto del tipo:
SELECT * FROM XYZ WHERE DITTA IN ('Ansaldo','Montedison');
selezionera' tutte le righein cui la colonna DITTA risultera' essere nellalista (nell'esempio solo Ansaldo o Montedison).
Potremmo ad esempio disporre di unatavola del tipo:
CLIENTE IMPORTO
------------------------
Rossini 50.000
Bolognini 30.000
Rossi 5.000
Verdi 90.000
Se scrivessimo
SELECT CLIENTE FROM XYZ WHERE IMPORTO IN (5000,30000,90000);
avremmo come risultato
CLIENTE
----------
Rossi
Bolognini
Verdi
L'ultima condizione e'BETWEEN (compreso tra .... e ....).
Il comando
SELECT NOME FROM XYZ WHERE PREZZO BETWEEN 50000 AND 100000;
e'equivalente a scrivere
SELECT NOME FROM XYZ WHERE PREZZO >= 50000 AND PREZZO <= 100000;
Per definizione si assume che i valori specificati con BETWEENsiano in ordine ascendente.
Vediamo infine la negazione NOT che funziona in congiunzione con leprecedenti condizioni LIKE, BETWEEN e IN.
SELECT * FROM XYZ WHERE IMPORTO NOT BETWEEN 3000 AND 10000;
visualizzerebbe tutte le righe ilcui contenuto del campo IMPORTO non e' compreso tra 3000 e 10000.
Allostesso modo
SELECT * FROM XYZ WHERE NOME NOT LIKE 'Rossi';
mostrerebbe tutte le righe con contenuto del campoNOME diverse
da'Rossi'.
Alcuni campi di un record potrebbero valere NULL.
NULL puo' essere utilizzato cometermine di selezione.
Adesempio
SELECT * FROM XYZ WHERE NOME IS NULL;
seleziona tutti i record che hannoNULL come campo NOME.
L'opposto e'
SELECT * FROM XYZ WHERE NOME IS NOT NULL;
Nel linguaggio SQL esistono alcunespecifiche utilizzabili con SELECT atte a ordinare i dati che devono essere
SELECT infatti visualizzerebbe
La specifica
ORDER BY [COLONNA] [ASC|DESC]
permette di ordinare i dati su una determinata colonna in modoascendente (ASC) o discendente (DESC).
Disponendo di una tavola:
NOME CITTA
-----------------
Rossi Alba
Bianchi Asti
Verdi Cuneo
Alessi Milano
ed eseguendo
SELECT NOME FROM XYZ ORDER BY NOME ASC;
avremmo come risultato
NOME
-------
Alessi
Bianchi
Rossi
Verdi
mentre l'ordine sarebbe inversonel caso di
SELECT NOME FROM XYZ ORDER BY NOME DESC;
Il comando d'ordinamento
Vedremo l'utilizzo dellaspecifica GROUP BY nel prossimo capitolo dopo aver introdotto gli operatorimatematici.