Daniele Merli
a- a+

Operatori matematici

Il linguaggio SQL, pur non essendo orientato al calcolomatematico, dispone della possibilita' di implementazionedei normali operatori matematici utilizzabili con lostatement SELECT per calcoli sui campi.
Disponendo di una tavola del tipo:

CLIENTE IMPORTO IVA
-----------------------------
Rossi 100000 19000
Verdi 120000 22800
Bianchi 180000 34200

e impostando

SELECT CLIENTE, (IMPORTO + IVA) FROM XYZ;

avremo come risultato

CLIENTE (IMPORTO + IVA)
---------------------------
Rossi 119000
Verdi 142800
Bianchi 214200

In ogni caso gli operatori SQL sono i seguenti.

Addizione +
Sotrazione -
Moltiplicazione *
Divisione /
Conteggio COUNT
Massimo MAX
Minimo MIN
Media AVG
Somma SUM

Gli operatori matematici dovrebbero essere intuitivi.
I seguenti costrutti valgono ad esempio per l'uso diquesti.

SELECT CLIENTE, (IMPORTO / 2) FROM XYZ;SELECT CLIENTE, ((IMPORTO + IVA) * 2) FROM XYZ;

Vediamo ora glialtri operatori.
Il primo e' COUNT.
In pratica questo riporta il numero degli headerrintracciati da SELECT.
Tenendo per valida la tabella precedente contenente trerighe e eseguendo:

SELECT COUNT(CLIENTE) FROM XYZ;

otterremmo 3.

Potremmo anche utilizzare COUNT con WHERE per sapere quanterighe sono presenti:

SELECT COUNT(*) FROM XYZ;

WHERE e' applicabile anche con SELECT COUNT().
Se volessimo, ad esempio, sapere quanti clienti hanno spesopiu' di 150.000 potremmo utilizzare:

SELECT COUNT(CLIENTE) FROM XYZ WHERE IMPORTO > 150000;

Altri due operatori destinati a selezionare i valori massimie minimi contenuti nei campi specificati sono MAX e MIN.
Supponendo di voler trovare l'importo minore nellatavola dei clienti:

SELECT MIN(IMPORTO) FROM XYZ;

E' possibile usare come argomento degli operatori MIN eMAX anche dei calcoli matematici.

SELECT MAX(IMPORTO / 100) FROM XYZ;

L'operatore SUM e' applicabile solo a campi numericie restituisce la somma dei valori contenuti in questi.

SELECT SUM(IMPORTO) FROM XYZ;

restituisce la somma di tutti gli importi presenti nellatavola (sempre quella riportata ad esempio nelle pagineprecedenti).
Se dovessimo calcolare una media di tutti gli importipresenti nella tavola potremmo dare il comando:

SELECT (SUM(IMPORTO) / COUNT(IMPORTO)) FROM XYZ;

In pratica verrebbe calcolata la somma di tutti gli importipresenti nella tavola e successivamente divisa per il numerodelle righe conteggiate.
Il linguaggio SQL possiede un operatore particolare chepermette di calcolare la media senza dover eseguire calcolicome nell'esempio precedente.
L'operatore e' AVG.
Usandolo l'esempio precedente diventerebbe :

SELECT AVG(IMPORTO) FROM XYZ;

Esiste un ulteriore specifica utilizzabile conl'operatore COUNT e' DISTINCT.
Una determinata colonna potrebbe contenere dei valoridupplicati.
Se si desidera avere il conteggio non considerando idupplicati e' possibile creare costrutti del tipo:

SELECT COUNT(DISTINCT CLIENTE) FROM XYZ;

Supponiamo di avere una tavola XYZ contenente l'elencodelle vendite di un determinato anno.

CLIENTE IMPORTO DATA
-------------------------------
Rossi 10000 12/12/89 
Bianchi 20000 12/12/89
Verdi 12000 12/12/89
Rossi 30000 13/12/89
Rossi 34000 15/12/89

Mediante

SELECT COUNT(CLIENTE) FROM XYZ;

avremmo come risultato il numero delle righe (record)presenti nella tavola ovvero 5.
Desiderando sapere il numero delle ditte a cui e' statovenduto del materiale dovremmo dare:

SELECT COUNT(DISTINCT CLIENTE) FROM XYZ;

Avremmo come risultato 3.

Altre tre funzioni di utilita' non elencate tra glioperatori precedenti sono LOWER, UPPER e LENGTH.
Il contenuto delle righe ricercate potrebbe esserevario.
Il nome di una ditta potrebbe risultare come"Rossi" , come "ROSSI" o ancora come"rossi".
Se avessimo una tavola con:

CLIENTE IMPORTO
------------------
Rossi 100000
Verdi 120000
Bianchi 130000

e cercassimo di rintracciare qualche riga con

SELECT CLIENTE FROM XYZ WHERE CLIENTE = 'ROSSI';

non troverremmo nulla dato che il linguaggio fa differenzatra caratteri maiuscoli e minuscoli e quindi"Rossi" risulta essere differente da"ROSSI".
Le funzioni LOWER e UPPER ci permettono di convertire ivalori delle colonne rintracciate da SELECT in minuscolo e inmaiuscolo. 
Non avendo la sicurezza sul tipo di caratteri contenuti inun campo potremmo usare:

SELECT UPPER(CLIENTE) FROM XYZ WHERE CLIENTE = 'ROSSI';

oppure

SELECT LOWER(CLIENTE) FROM XYZ WHERE CLIENTE = 'rossi';

La funzione LENGTH restituisce invece la lunghezza di ogniriga.

SELECT LENGTH(CLIENTE) FROM XYZ;

In pratica conta i caratteri di ogni campo.
Nel capitolo precedente avevamo rimandato il discorso legatoall'utilizzo della specifica GROUP BY.
Per introdurre il concetto di raggruppamento possiamo vedereun esempio pratico.
Supponiamo di avere una tavola del tipo:

PRODOTTO TIPO QUANTITA
---------------------------
Chiodi 1 20000
Bulloni 1 12000
Dadi 1 17000
Chiodi 2 10000

Se desiderassimo conoscere il numero totale dei pezzipresenti indipendentemente dal tipo del prodotto potremmousare:

SELECT SUM(QUANTITA) FROM XYZ;

Nel caso in cui ci interessasse sapere quanti chiodi abbiamopossiamo usare:

SELECT PRODOTTO, SUM(QUANTITA) FROM XYZ WHERE PRODOTTO='Chiodi';

Se volessimo avere visualizzate tutte le somme dei pezziraggruppati per tipo, allora:

SELECT PRODOTTO, SUM(QUANTITA) FROM XYZ GROUP BY PRODOTTO;

Il risultato sarebbe

PRODOTTO SUM(QUANTITA)
------------------------
Chiodi 30000
Bulloni 12000
Dadi 17000 

Parlando del WHERE avevamo visto come questo servisse adeliminare dalla selezione le righe.
WHERE non e' applicabile a GROUP BY.
Nel caso in cui si vuole eliminare alcuni gruppi e'possibile utilizzare la specifica HAVING.
E' possibile ad esempio creare costrutti del tipo:

SELECT CAMPO1 FROM XYZ GROUP BY CAMPO2 HAVING COUNT(*) > 1;