Capitolo 2
Espressioni e operatori condizionali
Tutte le volte che si vuole trovare un particolare elemento o gruppo di elementi in un database, occorre specificare una o più condizioni. Le condizioni sono introdotte dalla clausola WHERE.
Esempio:
STUDENTI |
NOME | Cognome | ANNO | Classe | Sezione |
Mario |
Bianchi |
1976 |
1 | A |
Anna | Bianco | 1973 | 2 | B |
Marta | Carli | 1974 | 3 | A |
Gianni | Rossi | 1972 | 4 | A |
Giulio | Mancini | 1972 | 5 | A |
Max | Zunini | 1976 | 5 | B |
con l’espressione:
SELECT *
FROM STUDENTI
WHERE CLASSE = 5
AND SEZIONE = ‘A’;
si ottiene:
NOME | Cognome | ANNO | Classe | Sezione |
Giulio | Mancini | 1972 | 5 | A |
Sono gli operatori aritmetici: + (somma), - (sottrazione), / (divisione), * (moltiplicazione).
data la tabella
PREZZO |
|
Elemento | PrezzoIngrosso |
Pomodori |
340 |
Patate | 510 |
Banane | 670 |
Rape | 450 |
Arance | 890 |
Mele | 230 |
nella seguente espressione:
SELECT ELEMENTO, PREZZOINGROSSO, PREZZOINGROSSO + 150
FROM PREZZO;
l’operatore + aggiunge 150 lire a ogni prezzo e genera la seguente tabella:
ELEMENTO | PREZZOINGROSSO | PREZZOINGROSSO + 150 |
Pomodori |
340 | 490 |
Patate | 510 | 660 |
Banane | 670 | 820 |
Rape | 450 | 600 |
Arance | 890 | 1040 |
Mele | 230 | 380 |
l’operatore meno svolge due funzioni. La prima è quella di cambiare il segno a un numero, la seconda è quella di sottrarre i valori di una colonna da quelli di un’altra colonna. Vediamo il primo caso:
MINMAX |
||
Regione |
TempMin |
TempMax |
Piemonte |
-4 |
10 |
Toscana | 4 |
13 |
Sicilia | 10 |
19 |
Lombardia | -2 |
9 |
Friuli | -3 |
8 |
con l’espressione
SELECT REGIONE, -TEMPMIN, -TEMPMAX
FROM MINMAX;
si ottiene
REGIONE |
TEMPMIN |
TEMPMAX |
Piemonte |
4 |
-10 |
Toscana | -4 |
-13 |
Sicilia | -10 |
-19 |
Lombardia | 2 |
-9 |
Friuli | 3 |
-8 |
Vediamo il secondo caso:
con l’espressione
SELECT REGIONE,
(TEMPMAX – TEMPMIN) Differenza
FROM MINMAX;
REGIONE | DIFFERENZA |
Piemonte |
14 |
Toscana | 9 |
Sicilia | 9 |
Lombardia | 11 |
Friuli | 11 |
Esempio: abbiamo la necessità di vendere a metà prezzo
PREZZO |
|
Elemento |
PrezzoIngrosso |
Pomodori | 340 |
Patate | 510 |
Banane | 670 |
Rape | 450 |
Arance | 890 |
Mele | 230 |
con l’espressione
SELECT Elemento, PrezzoIngrosso, (PrezzoIngrosso / 2) PrezzoVendita
FROM PREZZO;
si ottiene
ELEMENTO |
PREZZOINGROSSO | PREZZOVENDITA |
Pomodori | 340 | 170 |
Patate | 510 | 255 |
Banane | 670 | 335 |
Rape | 450 | 225 |
Arance | 890 | 445 |
Mele | 230 | 115 |
Operatore moltiplicazione (*):
Esempio: abbiamo la necessità di moltiplicare per 0.9
PREZZO |
|
Elemento |
PrezzoIngrosso |
Pomodori | 340 |
Patate | 510 |
Banane | 670 |
Rape | 450 |
Arance | 890 |
Mele | 230 |
con l’espressione
SELECT Elemento, PrezzoIngrosso, (PrezzoIngrosso * 0.9) NuovoPrezzo
FROM PREZZO;
si ottiene
ELEMENTO |
PREZZOINGROSSO | NUOVOPREZZO |
Pomodori | 340 | 306 |
Patate | 510 | 459 |
Banane | 670 | 603 |
Rape | 450 | 405 |
Arance | 890 | 801 |
Mele | 230 | 207 |
Esempio: dalla seguente tabella vogliamo estrapolare tutti i dati dell’amico Mario
AMICI |
||
Nome |
Cognome |
Telefono |
Giovanni | Bruni | 0763 546432 |
Antonio | Rossi | 06 756499 |
Mario | Rossi | 02 435591 |
Piero | Bianchi | 06 326799 |
SELECT *
FROM AMICI
WHERE NOME = ‘Mario’;
NOME |
COGNOME |
TELEFONO |
Mario | Rossi | 02 435591 |
Gli operatori: maggiore (>) , maggiore o uguale (>=), minore (<), minore o uguale (<=), diverso (<>):
Questi operatori si usano allo stesso modo di come si usa l’operatore di uguaglianza. Vediamo alcuni esempi:
ANAGRAFICA |
||
Nome |
Cognome |
Età |
Giovanni | Bruni | 55 |
Antonio | Rossi | 43 |
Mario | Rossi | 49 |
Piero | Bianchi | 37 |
Voglio sapere chi ha più di 44 anni
SELECT *
FROM ANAGRAFICA
WHERE Età > 44;
NOME |
COGNOME |
ETÀ |
Giovanni | Bruni | 55 |
Mario | Rossi | 49 |
Voglio sapere chi ha un’età diversa da 55 anni
SELECT *
FROM ANAGRAFICA
WHERE Età <> 55;
NOME |
COGNOME | ETÀ |
Antonio | Rossi | 43 |
Mario | Rossi | 49 |
Piero | Bianchi | 37 |
Modifichiamo ora la tabella ANAGRAFICA inserendo un altro nominativo di cui però non sappiamo l’età. In questo caso nel campo ETA verrà inserito in maniera ‘automatica’ il valore NULL che identifica l’assenza di dati:
NOME | COGNOME | ETA |
Giovanni |
Bruni |
55 |
Antonio | Rossi | 43 |
Mario | Rossi | 49 |
Piero | Bianchi | 37 |
Esmeralda | Gnocca |
Ora vogliamo conoscere il nome e il cognome delle persone di cui non abbiamo il dato età:
SELECT *
FROM ANAGRAFICA
WHERE ETA IS NULL;
NOME | COGNOME | ETA |
Esmeralda | Gnocca |
L’operatore IS funziona con la clausola NULL, ma possiamo sostituirlo anche con l’operatore (=): WHERE ETA = NULL;
Gli operatori di caratteri possono essere utilizzati per manipolare il modo in cui le stringhe devo essere ricercate.
È possibile estrarre da un database quei dati che assomigliano a un certo schema, senza essere perfettamente identici allo schema specificato. Vediamo qualche esempio:
ANATOMIA |
|
Nome |
Posizione |
Fegato | Destra-Addome |
Cuore | Petto |
Faringe | Gola |
Vertebre | Centro-Dorso |
Incudine | Orecchio |
Rene | Dorso |
SELECT *
FROM ANATOMIA
WHERE Posizione LIKE ‘%Dorso%’;
Nome |
Posizione |
Vertebre |
Centro-Dorso |
Rene | Dorso |
Si noti l’uso del segno ‘%’ dopo LIKE. Esso rappresenta zero, uno o più caratteri. Il corrispondente carattere implementato da Access è ‘*’.
Nome |
Posizione |
Rene | Dorso |
SELECT *
FROM ANATOMIA
WHERE Nome LIKE ‘F%’;
Nome |
Posizione |
Fegato | Destra-Addome |
Faringe | Gola |
Vediamo altri esempi:
NOMINATIVI |
||
Nome |
Cognome |
Provincia |
Giovanni | Bruni | CO |
Antonio | Rossi | MI |
Mario | Rossi | CT |
Piero | Bianchi | PV |
SELECT *
FROM NOMINATIVI
WHERE Provincia LIKE ‘C_’;
Nome |
Cognome |
Provincia |
Giovanni | Bruni | CO |
Mario | Rossi | CT |
Il carattere di sottolineatura (_) è un carattere che sostituisce un singolo carattere e non il carattere spazio. Il suo corrispettivo implementato da Access è ‘?’. Access implementa anche il segno ‘#’ che sostituisce qualsiasi singola cifra (0, 1, 2, 3, ecc,).
Operatore di concatenazione (||)
Il simbolo || serve a concatenare due stringhe. Il corrispettivo operatore che si usa con Access è ‘&’. Vediamo alcuni esempi:
AMICI |
||||
COGNOME | NOME | TELEFONO | PR | CAP |
ROSSI | ALESSANDRA | 0761 556632 | BG | 01023 |
VERDI | ALESSANDRA | 02 345622 | MI | 03456 |
MERRILI | TITTI | 0732 433388 | CO | 01255 |
BANFI | BARBY | 0722 114381 | BR | 03367 |
PERSIANI | MARIA | 0581 931522 | CA | 09941 |
MAZZA | JO | 0359 118267 | PV | 01944 |
BORDONI | CHIARA | 0445 668193 | CT | 01042 |
SELECT NOME || COGNOME NOMECOMPLETO
FROM AMICI;
NOMECOMPLETO |
ALESSANDRAROSSI |
ALESSANDRAVERDI |
TITTIMERRILI |
BARBYBANFI |
MARIAPERSIANI |
JOMAZZA |
BORDONICHIARA |
Access non implementa, oltre che l’operatore ‘||’, anche questo modo di ridenominare le colonne estrapolate:
SELECT NOME || COGNOME NOMECOMPLETO
Ecco un’altra applicazione dell’operatore di concatenazione:
SELECT COGNOME || ‘, ’ || NOME AMICO
FROM AMICI;
AMICO |
ROSI, ALESSANDRA |
VERDI, ALESSANDRA |
MERRILI, TITTI |
BANFI, BARBY |
PERSIANI, MARIA |
MAZZA, JO |
BORDONI, CHIARA |
Per comprendere a pieno gli operatori logici bisogna introdurre i fondamenti dell’algebra di Boole.
L’elemento essenziale del pensiero umano è la logica che permette all’uomo di formulare ragionamenti e di elaborare informazioni che gli vengono fornite dall’esterno. L’uomo si avvale di una logica esprimibile con un linguaggio che gli è congeniale e che si sa essere il linguaggio binario.
Il tipo di logica dei calcolatori è un modello applicativo di un sistema logico costituito nel secolo scorso dal matematico inglese George Boole che da lui prende il nome di ‘algebra booleana’.
Il sistema logico di Boole trae la sua prima ispirazione dal tentativo di introdurre un ‘calcolo logico’ o, più significativamente di ‘matematizzare’ le leggi del pensiero logico.
George Boole pubblicò nel 1856 un trattato in cui espose il suo articolato calcolo logico.
L’algebra delle proposizioni è la logica di cui si avvalgono i calcolatori per interpretare ed eseguire le istruzioni dei programmi; è anche la logica usata nella progettazione e per il funzionamento dei circuiti elettronici.
Algebra delle proposizioni
Le frasi del linguaggio della logica si differenziano notevolmente da quelle del linguaggio comune perché per ogni frase logica ha senso chiedersi se ciò che enuncia è vero o falso.
Le frasi del linguaggio della logica prendono il nome di proposizioni logiche o, più semplicemente, proposizioni ( o enunciati).
Per esempio, le frasi:
a: Roma è capitale d’Italia
b: 10 è un numero dispari
c: la rosa è un fiore;
sono proposizioni logiche. Infatti posiamo dire con certezza che gli enunciati a e c sono veri mentre l’enunciato b falso.
Consideriamo ora i seguenti enunciati:
d: che bello volare;
e: hai visto Maria?;
f : domani pioverà;
riferendoci a queste frasi non possiamo dire se sono vere o false. ‘Che bello volare’ può essere una proposizione vera per chi ama il volo, ma non per chi ne ha paura. La verità o la falsità della frase dipendono solo dalle emozioni soggettive. Così non si può dire se le frasi e e f sono vere o false. Quindi le frasi d, e, f non sono proposizioni logiche.
Da questo possiamo dire:
In logica si chiama proposizione ogni frase per la quale ha senso dire che è “vera”, o è “falsa”.
La logica delle proposizioni è anche detta logica bivalente proprio perché ogni proposizione può avere uno solo dei due valori: vero o falso.
Vediamo ora le operazioni sulle proposizioni.
Date le due proposizioni:
a: Mantova è una città;
b: L’Italia è una nazione;
la proposizione:
r: Mantova è una città e l’Italia è una nazione
è una proposizione composta, ottenuta operando sulle proposizioni a e b per mezzo del connettivo e. Il valore di verità di r dipende dai valori delle due proposizioni. L’operazione binaria che da come risultato il valore di verità r si chiama congiunzione logica.
DEFINIZIONE: Si chiama congiunzione logica un’operazione che ad ogni coppia di proposizioni a, b associa la proposizione composta r che è vera se a e b sono entrambe vere e falsa in tutti gi altri casi.
Il connettivo congiunzione viene indicato con AND. La tavola della verità della congiunzione logica è la seguente e si ottiene considerando tutte le possibile coppie di valori di verità attribuibili ad a e b.
a |
b |
r = a AND b |
FALSO |
FALSO |
FALSO |
FALSO |
VERO |
FALSO |
VERO |
FALSO |
FALSO |
VERO |
VERO |
VERO |
Date le proposizioni:
a: il quadrato è un poligono
b: Dante è un poeta
la proposizione:
r : il quadro è un poligono o Dante è un poeta
è una proposizione composta, ottenuta operando sulle proposizioni a e b per mezzo del connettivo o. L’operazione binaria che da come risultato il valore di verità r si chiama disgiunzione logica.
DEFINIZIONE: Si chiama disgiunzione logica un’operazione che ad ogni coppia di proposizioni a, b associa la proposizione composta r che è vera se almeno una delle due proposizioni è vera, falsa se a e b sono entrambe false.
Il connettivo disgiunzione logica viene indicato con OR. La tavola della verità della disgiunzione logica è la seguente e si ottiene considerando tutte le possibile coppie di valori di verità attribuibili ad a e b.
a |
b |
R = a OR b |
FALSO |
FALSO |
FALSO |
FALSO |
VERO |
VERO |
VERO |
FALSO |
VERO |
VERO |
VERO |
VERO |
Date le proposizioni:
a: 3 è un numero dispari
b: 3 non è un numero dispari
è evidente che la proposizione b è la negazione della proposizione a. Possiamo dire che b si ottiene da a mediante la sua negazione.
DEFINIZIONE: Si chiama negazione logica un’operazione che ad una proposizione a, associa la proposizione b la quale risulta vera se a è falsa e falsa se a è vera.
La negazione logica viene indicata con NOT. La tavola della verità della negazione logica è la seguente.
a |
NOT a |
FALSO |
VERO |
VERO |
FALSO |
Negli esempi che utilizzeremo, per meglio comprendere gli operatori logici, non appariranno espressioni booleane complesse ma espressioni semplici, cioè composte da un solo operatore. Dobbiamo far presente però, che tali operatori sono utilizzabili come qualsiasi altro operatore matematico, dunque nulla ci impedisce di creare delle vere e proprie espressioni algebriche lunghe a piacere.
La breve panoramica sull’algebra booleana termina qui; vista la semplicità dell’argomento lasciamo al lettore il compito di utilizzare e ‘trasferire’ quanto a appreso, alle specifiche del linguaggio SQL.
Indica che entrambe le espressioni che si trovano ai suoi lati devono essere soddisfatte, vediamo un esempio:
FERIE |
|||
COGNOME |
ID_DIPENDENTE |
ANNI |
FERIE_GODUTE |
MARINI | 101 | 2 | 4 |
ROSSI | 104 | 5 | 23 |
ZAPPA | 107 | 8 | 45 |
VERDI | 233 | 4 | 80 |
BOLDI | 210 | 15 | 100 |
GIALLI | 211 | 10 | 78 |
vogliamo sapere quali impiegati hanno lavorato nell’azienda per 5 anni o più e hanno utilizzato più di 50 giorni di ferie.
SELECT COGNOME
FROM FERIE
WHERE ANNI >= 5
AND FERIE_GODUTE > 50;
COGNOME |
BOLDI |
GIALLI |
È sufficiente che una sola espressione sia verificata per ottenere il valore TRUE, vediamo un esempio:
vogliamo sapere i cognomi dei dipendenti che non hanno più di 5 anni di servizio o hanno goduto ferie per più di 80 giorni.
SELECT COGNOME
FROM FERIE
WHERE ANNI <= 5
OR FERIE_GODUTE > 80;
COGNOME |
MARINI |
ROSSI |
ZAPPA |
VERDI |
BOLDI |
Ha il compito di invertire il significato di una condizione, vediamo un esempio:
vogliamo conoscere i cognomi che non iniziano per B.
SELECT COGNOME
FROM FERIE
WHERE COGNOME NOT LIKE ‘B%’;
COGNOME |
MARINI |
ROSSI |
ZAPPA |
VERDI |
GIALLI |
pag. 3 di 20 |