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.

 




Ti potrebbe interessare anche

commenta la notizia