Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Come eseguire operazioni matematiche sui dati estratti da un database MySQL

Contare con MySQL: algebra, matematica, trigonometria applicate ai dati estratti da un database MySQL
Contare con MySQL: algebra, matematica, trigonometria applicate ai dati estratti da un database MySQL
Link copiato negli appunti

Spesso abbiamo la necessità di eseguire operazioni matematiche, anche complesse, su dati estratti da un database. Quello che non tutti sanno è che non è necessario estrarre i dati di origine per eseguire la nostra funzione con un linguaggio di programmazione: MySQL dispone già di molti strumenti adatti a tale scopo. In questo modo potremo ottenere tramite una query MySQL direttamente il risultato che stavamo cercando con tre indubbi vantaggi:

  • MySQL penserà automaticamente ad ottimizzare la formula che abbiamo fornito
  • possiamo sfruttare questa proprietà per ordinare i dati in base proprio al risultato atteso calcolato appunto prima di estrarli
  • possiamo usare questa proprietà all'interno di una query di tipo INSERT o UPDATE: in questo modo ad esempio è possibile aggiungere ad una tabella con due campi (a e b) un campo somma contenente appunto la somma dei due precedenti popolandolo senza l'ausilio di un ciclo di un linguaggio di programmazione.

I dati numerici

Per quanto riguarda i tipi di dati numerici, come concetto generale, è bene ricordare che esistono essenzialmente due tipi di dati: interi e decimali e che a seconda delle opzioni con cui è stato creato il campo sono supportati o meno i dati negativi. Per una spiegazione accurata dei tipi di dati numerici consiglio di leggere la parte dedicata nella guida di Html.it.

Ovviamente è possibile operare su un numero decimale approssimandolo per trasformarlo in un intero oppure più in generale per abbassare il numero di cifre significative dopo la virgola.

Round(x, d) e Truncate(x, d)

Restituisce il valore x arrotondato alla cifra decimale numero d. Se la cifra successiva è compresa tra 0 e 5 il decimale numero d rimane invariato, in caso contrario viene aumentato di un'unità.

SELECT round(1.234567, 4); -- 1.2346
SELECT round(1.234511, 4); -- 1.2345

In maniera più brusca rispetto a round() questa funzione elimina tutti i decimali che seguono la posizione d.

SELECT round(1.234567, 4); -- 1.2345

Floor(x), Ceiling(x) e Round(x)

La funzione floor() restituisce il primo intero non superiore al valore passato: equivale ad usare truncate().

SELECT floor(1.234567); -- 1
SELECT truncate(1.234511, 0); -- 1

La funzione ceiling() restituisce invece il primo intero non inferiore al valore passato.

SELECT floor(1.234567); -- 2

Per trovare la giusta via di mezzo è consigliabile usare round() senza il parametro della precisione che si occupa in questo modo di approssimare all'intero più vicino al valore passato.

Aritmetica

MySQL supporta la matematica delle operazioni di base come i normali linguaggi di programmazione. Possiamo quindi dire che MySQL è promosso con successo dalle elementari alla scuola media.

Somma (+)

SELECT 5 + 2; -- 7

Differenza (-)

SELECT 5 - 2; -- 3

Prodotto (*)

SELECT 5 * 2; -- 10

Quoziente (/)

SELECT 5 / 2; -- 2.5

La divisione tra interi permette di ricavare il risultato intero della divisione tra due numeri con una precisione maggiore rispetto alla divisione normale e al successivo arrotondamento.

Quoziente tra interi (DIV)

SELECT 5 DIV 2; -- 2

Mod permette di ottenere il resto della divisione intera tra due numeri. Sono presenti due versioni:

Resto (MOD)

SELECT 5 MOD 2; -- 1
SELECT 6 % 2; -- 0

Algebra

Espandendo la matematica dell'aritmetica possiamo utilizzare anche altre funzioni definite algebriche che valgono per i numeri reali.

Abs(x)

Restituisce il valore assoluto del numero che abbiamo passato. Questo equivale in pratica a restituire il numero passato sostituendo l'eventuale segno meno con un segno positivo.

SELECT abs(-5); -- 5
SELECT abs(5); -- 5

Pow(b, x), Exp(x) e Sqrt(x)

La funzione esponenziale è quella funzione che moltiplica uno dei parametri passati (denominato base) per se stesso un numero di volte pari al secondo parametro passato (denominato esponente).

SELECT pow(5, 3); -- 5*5*5 = 125

In molti campi di applicazione si fa ricorso a questa funzione con una base fissata rappresentata dalla lettera e chiamata base naturale. Per questo motivo è presente una funzione esponenziale in base e a cui basta passare l'esponente.

SELECT exp(1); -- e = 2.71828
SELECT pow(2.71828, 1); -- e = 2.71828

Se l'esponente è minore di 1 la funzione esponente diviene la funzione radice, il cui esempio più celebre è rappresentato dalla radice quadrata in cui cioè l'esponente equivale a 1/2. Anche in questo caso è presente una funzione per applicare direttamente la radice quadrata.

SELECT sqrt(9); -- 3
SELECT Pow(9, 1/2); -- 3

Log(b, x), Ln(x), Log2(x) e Log10(x)

La funzione logaritmica è l'inversa della funzione esponenziale: dato un valore e una base questa funzione calcola l'esponente da assegnare alla base per ottenere il valore.

SELECT Log(3, 9); -- 2 (3^2 = 9)

Prima della versione 4.0.3 di MySQL non era possibile passare alla funzione Log() una base arbitraria e il logaritmo veniva calcolato in base e. Se il server su cui doveste operare avesse una versione precedente potreste comunque calcolare il logaritmo in base b di x nel seguente modo:

Log(b, x) = Log(x)/Log(b)

SELECT Log(9)/Log(3); -- 2 (3^2 = 9)

Dato l'uso nella pratica sono presenti funzioni per calcolare direttamente il logaritmo

  • in base 10: Log10(x);
  • in base 2: Log2(x) (presente dalla versione 4.0.3);
  • in base e: Log(x) o Ln(x) (quest'ultimo presente dalla versione 4.0.3)

Trigonometria

La trigonometria è quella parte della matematica che si occupa delle operazioni effettuate sugli angoli. Queste operazioni possono essere molto utili in diversi campi di applicazione, come ad esempio nei sistemi di posizionamento satellitare: possiamo in questo modo calcolare la distanza tra due punti su una sfera o per approssimazione sulla Terra avendo a disposizione un database di città con le relative coordinate geografiche.

Gli angoli vengono indicati nell'uso comune tramite una scala graduata sessagesimale (ossia espressa in sessantesimi di unità) che divide un angolo giro in 360 gradi, ognuno dei quali diviso in 100 primi, ognuno dei quali diviso in 100 secondi; un angolo scritto secondo questa scala è indicato ad esempio con 34° 22' 67''.

In matematica si preferisce utilizzare invece una scala graduata di valori continui in cui l'angolo giro viene rappresentato dal valore 2*Pi Greco. Le funzioni trigonometriche di MySQL operano secondo questa seconda scala e gli angoli vengono misurati in radianti.

Esistono innanzitutto le funzioni per passare da un sistema di misura all'altro:

Radians(x)

SELECT radians(180); -- Pi Greco

Degrees(x)

SELECT degrees(pi()); -- 90

Essendo il Pi Greco un numero irrazionale, non rappresentabile cioè tramite una frazione, è necessario avere una funzione in grado di ricavarlo con la minore approssimazione consentita dal database.

Pi()

SELECT pi(); -- 3.14159

Sono presenti poi le classiche funzioni trigonometriche con le rispettive funzioni inverse. I parametri delle funzioni dirette sono angoli espressi in radianti, quelli delle funzioni inverse sono valori numerici compresi tra -1 e 1 per l'arcoseno e l'arcocoseno e tra -infinito e +infinito per l'arcotangente:

sin(x) e asin(x)

SELECT sin(0); -- 0
SELECT asin(0); -- 0
SELECT asin(sin(pi())); -- Pi Greco

Bisogna fare attenzione però perchè non sempre l'arcoseno restituisce l'angolo sperato, già che lo stesso seno appartiene a due angoli diversi.

Queste funzioni si comportano come seno e arcoseno.

cos(x) e acos(x)

SELECT cos(0); -- 1
SELECT acos(0); -- Pi Greco/2
SELECT acos(cos(pi())); -- Pi Greco

La tangente di un angolo è definita come il rapporto tra il suo seno e il suo coseno. Questa funzione non ha significato quindi per gli angoli per cui cos(x) è uguale a zero.

tan(x) e atan(x)

SELECT tan(0); -- 0
SELECT atan(0); -- 0

Ti consigliamo anche