Daniele Merli
a- a+

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   35.000

           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  '%'  (percento)   e  '_' (underscore).

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      03121323423

                    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.

        Ad esempio

SELECT * FROM XYZ WHERE FLAGS LIKE 'O\_R%' ESCAPE '';

In questo  caso  '' viene interpretato da  SQL  come  carattere d'escape  e'_' come carattere effettivo da ricercare e non  come carattere jolly.

Un altro operatore relazionaleatipico (rispetto a <,  >ecc.) e' IN.

Mediante IN  e'  possibile specificare una lista  di  valori  da utilizzare come clausole diricerca.

 

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.

        Ad esempio

 

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  mostrati e  a raggrupparli.

SELECT infatti  visualizzerebbe  le informazioni   nello stesso ordine con cui sono rintracciate.

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  non altera fisicamente le  tavole  mainfluisce semplicemente sulla visualizzazione.

Vedremo l'utilizzo dellaspecifica GROUP BY nel prossimo capitolo dopo aver introdotto gli operatorimatematici.