SQL to nie tylko tekst i tabele. W prawdziwych bazach danych często musisz ogarniać ceny, ilości, punkty, procenty, współrzędne, czyli po prostu liczby. Wyobraź sobie:
- Licząc zniżki chcesz zaokrąglić sumę do całości.
- Chcesz wyświetlić dane o parzystych/nieparzystych studentach.
- Robisz analizę ocen i chcesz znać pierwiastek kwadratowy z wariancji.
- Albo budujesz wzory na punkty z potęgowaniem.
SQL ogarnia to wszystko bez pomocy zewnętrznych języków programowania — wszystko można zrobić bezpośrednio w zapytaniach dzięki wbudowanym funkcjom matematycznym. Dzisiaj ogarniemy sześć najbardziej przydatnych:
ROUND()— zaokrąglanieCEIL()— zaokrąglanie w góręFLOOR()— zaokrąglanie w dółMOD()— reszta z dzieleniaPOWER()— potęgowanieSQRT()— pierwiastek kwadratowy
* Zaokrąglanie liczb: ROUND(), CEIL(), FLOOR()*
Często przy pracy z liczbami zmiennoprzecinkowymi (np. 4.67891) trzeba zaokrąglić wynik. Na przykład, gdy liczysz średnią ocenę, końcową wartość zamówienia, procent zniżki itd. — zbędne cyfry po przecinku nie tylko "psują" wygląd, ale mogą też wprowadzać w błąd.
ROUND() — zaokrąglanie według zasad matematyki
ROUND(number [, digits])
number— liczba, którą zaokrąglasz.digits(opcjonalny) — ile miejsc po przecinku zostawić.
Przykłady:
SELECT ROUND(4.67); -- 5
SELECT ROUND(4.6789, 2); -- 4.68
ROUND() działa tak samo jak klasyczne zaokrąglanie w matematyce: 4.5 → 5, 4.49 → 4.
Bardzo przydatne, jeśli pracujesz z kasą albo punktami, które mają wyglądać ładnie: 4.33333 → 4.33.
CEIL() — zaokrąglanie w górę do najbliższej całości
SELECT CEIL(4.1); -- 5
- Jeśli liczba już jest całkowita, wynik się nie zmienia.
- Zawsze zwraca liczbę całkowitą, nie mniejszą niż oryginał.
Przydatne np. gdy musisz określić liczbę stron do wyświetlenia produktów: 21 produktów przy 10 na stronę → potrzebujesz 3 strony.
FLOOR() — zaokrąglanie w dół
SELECT FLOOR(4.9); -- 4
- Zwraca liczbę całkowitą, nie większą niż oryginał.
Używane, gdy musisz określić "piętro" albo "stopień", na którym jest wartość.
Porównanie:
| Wartość | ROUND() | CEIL() | FLOOR() |
|---|---|---|---|
| 4.4 | 4 | 5 | 4 |
| 4.6 | 5 | 5 | 4 |
| -4.6 | -5 | -4 | -5 |
* Reszta z dzielenia: MOD()*
Po co reszta? Na przykład:
- Sprawdzić, czy liczba jest parzysta.
- Podzielić wiersze na grupy według wzoru (np. rozdział na 3 drużyny).
- Zrobić powtarzający się cykl (np. "co piąty rekord").
Składnia:
MOD(dividend, divisor)
Przykłady:
SELECT MOD(17, 5); -- 2 (3*5 +2)
SELECT MOD(10, 3); -- 1 (3*3 +1)
Pamiętaj: znak reszty zależy od znaku pierwszego argumentu (dividend).
Zastosowanie:
SELECT student_id,
CASE WHEN MOD(student_id, 2) = 0 THEN 'Parzysty' ELSE 'Nieparzysty' END AS parity
FROM students;
* Potęgowanie: POWER()*
Czasem trzeba nie tylko mnożyć, ale użyć wzorów matematycznych:
- Obliczanie procentów:
base * POWER(1 + rate, years) - Pole koła:
π * r^2 - Wagi wzorów w machine learning
Składnia:
POWER(base, exponent)
Przykłady:
SELECT POWER(2, 3); -- 8
SELECT POWER(5, 2); -- 25
SELECT POWER(9, 0.5); -- 3 (pierwiastek kwadratowy)
Funkcja przyjmuje dowolne liczby: całkowite, zmiennoprzecinkowe, ujemne.
Pierwiastek kwadratowy: SQRT()
Jeśli musisz policzyć pierwiastek, szczególnie w statystyce (np. odchylenie standardowe), SQRT() się przyda.
SELECT SQRT(25); -- 5
SELECT SQRT(2); -- ~1.4142
Jeśli podasz liczbę ujemną — będzie błąd. Jeśli to możliwe w twoich danych, użyj ABS():
SELECT SQRT(ABS(-25)); -- 5
Praktyczne scenariusze
Scenariusz 1: zaokrąglanie końcowej sumy zamówienia
SELECT order_id, ROUND(total_price, 0) AS total_rounded
FROM orders;
Scenariusz 2: obliczanie liczby stron do wyświetlenia
SELECT CEIL(COUNT(*) / 10.0) AS pages_needed
FROM products;
Scenariusz 3: podział studentów na 3 grupy
SELECT student_id,
MOD(student_id, 3) AS group_number
FROM students;
Scenariusz 4: pierwiastek ze średniej kwadratowej
SELECT SQRT(AVG(POWER(score, 2))) AS root_mean_square
FROM grades;
Typowe błędy i porady
ROUND() może przyjmować drugi argument — nie zapomnij o nim, jeśli chcesz zaokrąglić do setnych.
MOD() z liczbami ujemnymi może zwracać nieoczekiwane wyniki.
POWER() i SQRT() działają z argumentami zmiennoprzecinkowymi — użyj CAST() jeśli trzeba.
Upewnij się, że do SQRT() nie trafi liczba ujemna, bo będzie błąd wykonania.
GO TO FULL VERSION