Skip to content

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:

syntaxe
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

SQL> select prix*1.186 from biblio
SQL> select titre from biblio where prix between 100 and 150

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

nombre1 > nombre2
: numero1 è maggiore di numero2
nombre1 >= nombre2
: numero1 maggiore o uguale a numero2
nombre1 < nombre2
: numero1 è minore di numero2
nombre1 <= nombre2
: numero1 è minore o uguale a numero2
nombre1 = nombre2 
: numero1 uguale a numero2
nombre1 != nombre2 
: numero1 diverso da numero2
nombre1 <> nombre2
: idem
nombre1 BETWEEN nombre2 AND nombre3
: numero1 nell'intervallo [nombre2,nombre3]
nombre1 IN (liste de nombres)
: numero1 appartiene all'elenco di numeri
nombre1 IS NULL
: numero1 non ha alcun valore
nombre1 IS NOT NULL
: numero1 ha un valore

Operatori aritmetici

nombre1 + nombre2
: addizione
nombre1 - nombre2
: sottrazione
nombre1 * nombre2
: moltiplicazione
nombre1 / nombre2
: 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:

SQL> select titre,prix from biblio where prix between 100 and 150

Image

SQL> select titre,prix from biblio where prix not between 100 and 150

Image

SQL> select titre,prix from biblio where prix in (200,210)

Image

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%:

    SELECT TITRE, PRIX*1.186 FROM BIBLIO

Se i prezzi devono aumentare del 3%, il comando sarà

    UPDATE BIBLIO SET PRIX = PRIX*1.03

In un’espressione possono essere presenti diversi operatori aritmetici, oltre a funzioni e parentesi. Questi elementi vengono elaborati secondo priorità diverse:

1
fonctions
<---- priorità maggiore
2
()
 
3
* et /
 
4
+ et -
<---- 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

chaine1 > chaine2
: stringa1 è maggiore di stringa2
chaine1 >= chaine2
: stringa1 maggiore o uguale a stringa2
chaine1 < chaine2
: stringa1 minore di stringa2
chaine1 <= chaine2
: stringa1 minore o uguale a stringa2
chaine1 = chaine2 
: stringa1 uguale a stringa2
chaine1 != chaine2
: stringa1 diversa da stringa2
chaine1 <> chaine2
: idem
chaine1 BETWEEN chaine2 AND chaine3
: stringa1 nell'intervallo [chaine2,chaine3]
chaine1 IN liste de chaines
: stringa1 appartiene all'elenco delle stringhe
chaine1 IS NULL
: stringa1 non ha alcun valore
chaine1 IS NOT NULL
: stringa1 ha un valore
chaine1 LIKE modèle
: 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:

blanc<..< 0 < 1 < ...< 9 < ...< A < B <... < Z < ... < a < b < ... < z

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:

     'CHAT    ' 'CHIEN'
----------------------------
    'C'    =    'C'
    'H'    =    'H'
     'A    '     < 'I'

Dopo quest'ultimo confronto, la stringa 'CHAT' risulta più corta della stringa 'CHIEN'. La relazione 'CHAT' < 'CHIEN' è quindi vera.

Confrontiamo ora «CHAT» e «chat».

     'CHAT    ' 'chat'
--------------------------
     'C    '     < 'c'

Dopo questo confronto, la relazione 'CHAT' < 'chat' viene dichiarata vera.

Esempi

SQL> select titre from biblio

Image

SQL> select titre from biblio where upper(titre) between 'L' and 'M'

Image

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

SQL> select titre from biblio

Image

SQL> select titre from biblio where titre like 'M%';

Image

SQL> select titre from biblio where titre like 'L_ %';

Image

4.2.2.5. L'operatore di concatenazione

SQL > select '[' || titre || ']' from biblio where upper(titre) LIKE 'L_ %'

Image

4.2.3. Espressioni con operandi di tipo data

Siano date1, date2, date3 delle date. Gli operatori utilizzabili sono i seguenti:

Operatori relazionali

date1 < date2
è vera se data1 è precedente a data2
date1 <= date2
è vera se data1 è precedente o uguale a data2
date1 > date2
è vera se data1 è successiva a data2
date1 >= date2
è vera se data1 è successiva o uguale a data2
date1 = date2
è vera se data1 e data2 sono identiche
date1 <> date2
è vera se data1 e data2 sono diverse.
date1 != date2
idem
date1 BETWEEN date2 AND date3
è vera se data1 è compresa tra data2 e data3
date1 IN (liste de dates)
è vera se data1 è presente nell'elenco delle date
date1 IS NULL
è vera se data1 non ha alcun valore
date1 IS NOT NULL
è vera se data1 ha un valore
date1 LIKE modèle
è vera se date1 corrisponde al modello
ALL,ANY,EXISTS
 

Operatori aritmetici

date1 - date2
: numero di giorni che separano data1 da data2
date1 - nombre
: data2 tale che data1 - data2 = numero
date1 + nombre
: data2 tale che data2 - data1 = numero

Esempi

SQL> select achat from biblio

Image

SQL>select achat from biblio
   where achat between '01.01.1988' and '31.12.1988';

Image

SQL> select titre, achat from biblio
where cast(achat as char(10)) like '1988'

Image

Quanti anni hanno i libri della biblioteca?

SQL> select titre, cast('now' as date)-achat "age(jours)" from biblio

Image

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à:


booléen1 AND booléen2
è vera se sia booléen1 che booléen2 sono entrambi veri.

booléen1 OR booléen2
è vera se booléen1 o booléen2 è vera.

NOT booléen1
ha come valore l'inverso del valore di booléen1.

Esempi

SQL> select titre,genre,prix from biblio order by prix desc

Image

Si cercano i libri con un prezzo compreso tra:

SQL> select titre,genre,prix from biblio
     where prix>=130 and prix <=170

Image

Ricerca inversa:

SQL> select titre,genre,prix from biblio
     where prix<130 or prix >170
     order by prix asc

Image

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

Image

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

Image

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:

Image

Con IBExpert, procediamo come segue:

  • utilizziamo lo strumento [Script Excecutive] ottenuto tramite l'opzione [Tools/ Script Executive]:

Image

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

Image

  • quindi eseguiamo lo script:

Image

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:

Image

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

Image

e definiamola come segue (clic destro su Tabelle / Nuova tabella):

Inseriamo una sola riga in questa tabella:

Image

Image

Passiamo ora all’editor SQL (F12) e inviamo il seguente comando SQL:

SQL> select cos(0) from test

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):

Image

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


abs(nombre)
valore assoluto di un numero
abs(-15)=15

ceil(nombre)
il più piccolo numero intero maggiore o uguale a nombre
ceil(15,7) = 16

floor(nombre)
il numero intero più grande minore o uguale a nombre
floor(14,3)=14

div(nombre1,nombre2)
quoziente della divisione intera (il quoziente è un numero intero) di nombre1 per nombre2
div(7,3)=2

mod(nombre1,nombre2)
resto della divisione intera (il quoziente è un numero intero) di nombre1 per nombre2
mod(7,3)=1

sign(nombre)
-1 se nombre < 0
0 se nombre = 0
+1 se nombre > 0
sign(-6) = -1

sqrt(nombre)
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