4. Le espressioni del linguaggio SQL
4.1. Introduction
Nella maggior parte dei comandi SQL è possibile utilizzare un'espressione. Prendiamo ad esempio il comando SELECT:
SELECT expr1, expr2, ... da table WHERE expression |
SELECT seleziona le righe per le quali expression è vero e visualizza per ciascuna di esse i valori di expri.
Esempi
In questo paragrafo ci proponiamo di chiarire il concetto di espressione. Un’espressione elementare è del tipo:
operando1 opérateur operando2
oppure
funzione(parametri)
Esempio
Nell'espressione GENRE = 'ROMAN'
- GENRE è l'operando 1
- 'ROMAN' è l'operando 2
- = è l'operatore
Nell'espressione upper(genre)
- upper è una funzione
- "genre" è un parametro di questa funzione.
Tratteremo innanzitutto le espressioni con operatori, poi presenteremo le funzioni disponibili in Firebird.
4.2. Espressioni con operatore
Classificheremo le espressioni con operatori in base al tipo dei loro operandi:
- numeriche
- stringa di caratteri
- data
- booleano o logico
4.2.1. Espressioni con operandi di tipo numerico
4.2.1.1. Elenco degli operatori
Siano nombre1, nombre2, nombre3 dei numeri. Gli operatori utilizzabili sono i seguenti:
Operatori relazionali
: numero1 è maggiore di numero2 | |
: numero1 maggiore o uguale a numero2 | |
: numero1 è minore di numero2 | |
: numero1 è minore o uguale a numero2 | |
: numero1 uguale a numero2 | |
: numero1 diverso da numero2 | |
: idem | |
: numero1 nell'intervallo [nombre2,nombre3] | |
: numero1 appartiene all'elenco di numeri | |
: numero1 non ha alcun valore | |
: numero1 ha un valore |
Operatori aritmetici
: addizione | |
: sottrazione | |
: moltiplicazione | |
: divisione |
4.2.1.2. Operatori relazionali
Un'espressione relazionale esprime una relazione che è vera o falsa. Il risultato di tale espressione è quindi un valore booleano o logico.
Esempi:
![]()

![]()
4.2.1.3. Operatori aritmetici
L'espressione aritmetica ci è familiare. Essa esprime un calcolo da effettuare tra dati numerici. Abbiamo già incontrato espressioni di questo tipo: supponiamo che il prezzo memorizzato nelle schede del file BIBLIO sia un prezzo al netto delle imposte. Vogliamo visualizzare ogni titolo con il suo prezzo TTC per un tasso di TVA pari al 18,6%:
Se i prezzi devono aumentare del 3%, il comando sarà
In un’espressione possono essere presenti diversi operatori aritmetici, oltre a funzioni e parentesi. Questi elementi vengono elaborati secondo priorità diverse:
1 | <---- priorità maggiore | |
2 | ||
3 | ||
4 | <---- priorità inferiore |
Quando nell'espressione sono presenti due operatori con la stessa priorità, viene valutato per primo quello che si trova più a sinistra nell'espressione.
Esempi
L'espressione PRIX*TAUX+TAXES verrà valutata come (PRIX*TAUX)+TAXES. Infatti, sarà l'operatore di moltiplicazione a essere utilizzato per primo. L'espressione PRIX*TAUX/100 verrà valutata come (PRIX*TAUX)/100.
4.2.2. Espressioni con operandi di tipo carattere
4.2.2.1. Elenco degli operatori
Gli operatori utilizzabili sono i seguenti:
Siano catena1, catena2, catena3, modello delle stringhe
: stringa1 è maggiore di stringa2 | |
: stringa1 maggiore o uguale a stringa2 | |
: stringa1 minore di stringa2 | |
: stringa1 minore o uguale a stringa2 | |
: stringa1 uguale a stringa2 | |
: stringa1 diversa da stringa2 | |
: idem | |
: stringa1 nell'intervallo [chaine2,chaine3] | |
: stringa1 appartiene all'elenco delle stringhe | |
: stringa1 non ha alcun valore | |
: stringa1 ha un valore | |
: stringa1 corrisponde al modello |
Operatore di concatenazione
stringa1 || stringa2 : chaine2 concatenato a chaine1
4.2.2.2. Operatori relazionali
Cosa significa confrontare stringhe con operatori quali <, <=, ecc.?
Ogni carattere è codificato da un numero intero. Quando si confrontano due caratteri, vengono confrontati i loro codici interi. La codifica adottata rispetta l’ordine naturale del dizionario:
I numeri precedono le lettere e le maiuscole precedono le minuscole.
4.2.2.3. Confronto tra due stringhe
Consideriamo la relazione 'CHAT' < 'CHIEN'. È vera o falsa? Per effettuare questo confronto, il SGBD confronta le due stringhe carattere per carattere in base ai loro codici interi. Non appena si riscontrano due caratteri diversi, la stringa a cui appartiene il più piccolo dei due viene considerata più piccola dell’altra stringa. Nel nostro esempio, ‘CHAT’ viene confrontata con ‘CHIEN’. Si ottengono i seguenti risultati in sequenza:
Dopo quest'ultimo confronto, la stringa 'CHAT' risulta più corta della stringa 'CHIEN'. La relazione 'CHAT' < 'CHIEN' è quindi vera.
Confrontiamo ora «CHAT» e «chat».
Dopo questo confronto, la relazione 'CHAT' < 'chat' viene dichiarata vera.
Esempi


4.2.2.4. L'operatore LIKE
L'operatore LIKE si utilizza come segue: chaîne LIKE modèle
La relazione è vera se chaîne corrisponde a modèle. Quest’ultimo è una stringa di caratteri che può contenere due caratteri jolly:
che indica qualsiasi sequenza di caratteri | |
che indica 1 carattere qualsiasi |
Esempi

![]()
![]()
4.2.2.5. L'operatore di concatenazione
![]()
4.2.3. Espressioni con operandi di tipo data
Siano date1, date2, date3 delle date. Gli operatori utilizzabili sono i seguenti:
Operatori relazionali
è vera se data1 è precedente a data2 | |
è vera se data1 è precedente o uguale a data2 | |
è vera se data1 è successiva a data2 | |
è vera se data1 è successiva o uguale a data2 | |
è vera se data1 e data2 sono identiche | |
è vera se data1 e data2 sono diverse. | |
idem | |
è vera se data1 è compresa tra data2 e data3 | |
è vera se data1 è presente nell'elenco delle date | |
è vera se data1 non ha alcun valore | |
è vera se data1 ha un valore | |
è vera se date1 corrisponde al modello | |
Operatori aritmetici
: numero di giorni che separano data1 da data2 | |
: data2 tale che data1 - data2 = numero | |
: data2 tale che data2 - data1 = numero |
Esempi

![]()
![]()
Quanti anni hanno i libri della biblioteca?

4.2.4. Espressioni con operandi booleani
Ricordiamo che un valore booleano o logico può assumere due valori: vero o falso. L'operando logico è spesso il risultato di un'espressione relazionale.
Siano booléen1 e booléen2 due valori booleani. Esistono tre possibili operatori, che sono, in ordine di priorità:
| è vera se sia booléen1 che booléen2 sono entrambi veri. |
| è vera se booléen1 o booléen2 è vera. |
| ha come valore l'inverso del valore di booléen1. |
Esempi

Si cercano i libri con un prezzo compreso tra:
![]()
Ricerca inversa:

Attenzione all'ordine degli operatori!
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and prix>200 or prix<100
order by prix asc

Si utilizzano le parentesi per controllare la priorità degli operatori:
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and (prix>200 or prix<100)
order by prix asc

4.3. Le funzioni predefinite di Firebird
Firebird dispone di funzioni predefinite. Queste non sono immediatamente utilizzabili nei comandi SQL. È necessario innanzitutto eseguire lo script SQL <firebird>\UDF\ib_udf.sql dove <firebird> indica la directory di installazione di Firebird:

Con IBExpert, procediamo come segue:
- utilizziamo lo strumento [Script Excecutive] ottenuto tramite l'opzione [Tools/ Script Executive]:

- una volta che lo strumento è presente, carichiamo lo script <firebird>\UDF\ib_udf.sql:

- quindi eseguiamo lo script:

Una volta fatto ciò, le funzioni predefinite di Firebird sono disponibili per il database a cui si era connessi al momento dell'esecuzione dello script. Per verificarlo, è sufficiente accedere all'esploratore dei database e fare clic sul nodo [UDF] del database in cui sono state importate le funzioni:

Qui sopra sono riportate le funzioni disponibili nel database. Per testarle, è utile disporre di una tabella con una sola riga. Chiamiamola TEST:

e definiamola come segue (clic destro su Tabelle / Nuova tabella):
Inseriamo una sola riga in questa tabella:


Passiamo ora all’editor SQL (F12) e inviamo il seguente comando SQL:
che utilizza la funzione predefinita cos (coseno). Il comando sopra riportato calcola cos(0) per ogni riga della tabella TEST, quindi in realtà per una sola riga. Viene quindi semplicemente visualizzato il valore di cos(0):
![]()
Le funzioni UDF (funzioni definite dall'utente) sono funzioni che l'utente può creare; sul web è quindi possibile trovare librerie di funzioni UDF. Qui descriviamo solo alcune di quelle disponibili con la versione scaricabile di Firebird (2005). Le classifichiamo in base al tipo predominante dei loro parametri o al loro ruolo:
- funzioni con parametri di tipo numerico
- funzioni con parametri di tipo stringa
4.3.1. Funzioni con parametri di tipo numerico
| valore assoluto di un numero abs(-15)=15 |
| il più piccolo numero intero maggiore o uguale a nombre ceil(15,7) = 16 |
| il numero intero più grande minore o uguale a nombre floor(14,3)=14 |
| quoziente della divisione intera (il quoziente è un numero intero) di nombre1 per nombre2 div(7,3)=2 |
| resto della divisione intera (il quoziente è un numero intero) di nombre1 per nombre2 mod(7,3)=1 |
| -1 se nombre < 0 0 se nombre = 0 +1 se nombre > 0 sign(-6) = -1 |
| radice quadrata di nombre se nombre ≥ 0 -1 se nombre<0 sqrt(16)=4 |
4.3.2. Funzioni con parametri di tipo stringa
ascii_char(numero) | carattere con codice ASCII nombre ascii_char(65) = 'A' |
lower(stringa) | converte chaine in minuscolo lower('INFO') = 'info' |
ltrim(stringa) | Left Trim - Gli spazi che precedono il testo di chaine vengono rimossi: ltrim(' gattino')='gattino' |
replace(stringa1, stringa2, stringa3) | sostituisce chaine2 con chaine3 in chaine1. replace('gatto e cane','g','**')='**atto e **ane' |
rtrim(stringa1, stringa2) | Right Trim - come ltrim ma a destra rtrim('gatto ')='gatto' |
substr(stringa, p, q) | sottostringa di chaine che inizia nella posizione p e termina nella posizione q. substr('chaton',3,5)='ato' |
ascii_val(carattere) | codice ASCII di caractère ascii_val('A')=65 |
strlen(stringa) | numero di caratteri di chaine strlen('gattino') = 6 |