CodeGym /Corsi /SQL SELF /Funzioni numeriche in SQL: arrotondamento, resto, potenza...

Funzioni numeriche in SQL: arrotondamento, resto, potenza e radice

SQL SELF
Livello 8 , Lezione 3
Disponibile

SQL non è solo roba di testo e tabelle. Nelle basi dati reali spesso ti tocca lavorare con prezzi, quantità, punti, percentuali, coordinate, cioè con numeri. Immagina:

  • Stai calcolando degli sconti e vuoi arrotondare la somma al numero intero.
  • Vuoi mostrare dati su studenti pari/dispari.
  • Stai facendo analisi sui voti e vuoi sapere la radice quadrata della varianza.
  • Oppure costruisci formule di calcolo dei punti con l’elevamento a potenza.

SQL può gestire tutto questo senza aiuto di altri linguaggi di programmazione — puoi fare tutto direttamente nelle query usando le funzioni matematiche integrate. Oggi vediamo le sei più utili:

  • ROUND() — arrotondamento
  • CEIL() — arrotondamento verso l’alto
  • FLOOR() — arrotondamento verso il basso
  • MOD() — resto della divisione
  • POWER() — elevamento a potenza
  • SQRT() — radice quadrata

* Arrotondamento dei numeri: ROUND(), CEIL(), FLOOR()*

Spesso quando lavori con numeri decimali (tipo 4.67891) devi arrotondare il risultato. Per esempio, se calcoli la media dei voti, il prezzo finale di un ordine, la percentuale di sconto ecc., — cifre in più dopo la virgola non solo "rovinano" l’aspetto, ma possono anche confondere.

ROUND() — arrotondamento secondo le regole matematiche

ROUND(number [, digits])
  • number — il numero che vuoi arrotondare.
  • digits (opzionale) — quanti decimali lasciare dopo la virgola.

Esempi:

SELECT ROUND(4.67);       -- 5
SELECT ROUND(4.6789, 2);  -- 4.68

ROUND() funziona come l’arrotondamento classico in matematica: 4.5 → 5, 4.49 → 4.

Molto utile se lavori con soldi o punti che devono essere visualizzati bene: 4.333334.33.

CEIL() — arrotondamento verso l’alto al prossimo intero

SELECT CEIL(4.1);  -- 5
  • Se il numero è già intero, il risultato non cambia.
  • Restituisce sempre un numero intero, non minore dell’originale.

Utile, per esempio, se devi calcolare il numero di pagine per mostrare i prodotti: 21 prodotti con 10 prodotti per pagina → servono 3 pagine.

FLOOR() — arrotondamento verso il basso

SELECT FLOOR(4.9);  -- 4
  • Restituisce un intero, non maggiore dell’originale.

Si usa quando devi capire su quale "piano" o "gradino" si trova un valore.

Confronto:

Valore ROUND() CEIL() FLOOR()
4.4 4 5 4
4.6 5 5 4
-4.6 -5 -4 -5

* Resto della divisione: MOD()*

Perché serve il resto? Per esempio:

  • Verificare se un numero è pari.
  • Dividere le righe in gruppi secondo uno schema (tipo, distribuzione in 3 squadre).
  • Implementare un ciclo ricorrente (tipo, "ogni quinta riga").

Sintassi:

MOD(dividend, divisor)

Esempi:

SELECT MOD(17, 5);  -- 2  (3*5 +2)
SELECT MOD(10, 3);  -- 1  (3*3 +1)

Attenzione: il segno del resto dipende dal segno del primo argomento (dividend).

Applicazione:

SELECT student_id,
       CASE WHEN MOD(student_id, 2) = 0 THEN 'Pari' ELSE 'Dispari' END AS parity
FROM students;

* Elevamento a potenza: POWER()*

A volte non basta moltiplicare, ma serve usare formule matematiche:

  • Calcolo degli interessi: base * POWER(1 + rate, years)
  • Area del cerchio: π * r^2
  • Pesi delle formule nel machine learning

Sintassi:

POWER(base, exponent)

Esempi:

SELECT POWER(2, 3);   -- 8
SELECT POWER(5, 2);   -- 25
SELECT POWER(9, 0.5); -- 3 (radice quadrata)

La funzione accetta qualsiasi numero: interi, decimali, negativi.

Radice quadrata: SQRT()

Se ti serve calcolare la radice, soprattutto in statistica (tipo la deviazione standard), SQRT() ti torna utile.

SELECT SQRT(25);    -- 5
SELECT SQRT(2);     -- ~1.4142

Se passi un numero negativo — ottieni un errore. Se può succedere nei tuoi dati, usa ABS():

SELECT SQRT(ABS(-25));  -- 5

Scenari pratici

Scenario 1: arrotondare il totale dell’ordine

SELECT order_id, ROUND(total_price, 0) AS total_rounded
FROM orders;

Scenario 2: calcolo delle pagine da mostrare

SELECT CEIL(COUNT(*) / 10.0) AS pages_needed
FROM products;

Scenario 3: distribuzione degli studenti in 3 gruppi

SELECT student_id,
       MOD(student_id, 3) AS group_number
FROM students;

Scenario 4: radice della media dei quadrati

SELECT SQRT(AVG(POWER(score, 2))) AS root_mean_square
FROM grades;

Errori tipici e consigli

ROUND() può accettare un secondo argomento — non dimenticarlo se vuoi arrotondare ai centesimi.

MOD() con numeri negativi può dare risultati inaspettati.

POWER() e SQRT() funzionano anche con argomenti decimali — usa CAST() se serve.

Assicurati che in SQRT() non finisca un numero negativo, altrimenti avrai un errore di esecuzione.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION