Dzielenie całkowite a dziesiętne
Unikaj zaskakujących wyników dzięki rzutowaniu typów
Dzielenie całkowite a dziesiętne to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Zaskakujący wynik
Zacznijmy od zagadki. Jak Państwo sądzą, co zwraca poniższe zapytanie?
Jeśli spodziewają się Państwo wyniku 0.5, mogą się Państwo zdziwić. W wielu bazach danych SQL dzielenie dwóch liczb całkowitych daje wynik całkowity — część dziesiętna jest całkowicie odrzucana.
SELECT 1 / 2 AS result;Wyjaśnienie dzielenia całkowitego
Gdy oba operandy dzielenia są liczbami całkowitymi, SQL wykonuje dzielenie całkowite. Wynik jest obcinany w kierunku zera — bez zaokrąglania, pozostaje tylko część całkowita.
Zatem 1 / 2 = 0, 7 / 3 = 2, a 9 / 4 = 2. Część ułamkowa jest po cichu odrzucana.
SELECT 7 / 3 AS truncated_result;Więcej przykładów dzielenia całkowitego
Oto kilka przykładów dzielenia całkowitego w jednym zapytaniu. Warto zauważyć, że wszystkie wyniki tracą część dziesiętną. To zachowanie jest spójne we wszystkich wyrażeniach zawierających wyłącznie literały całkowite lub kolumny całkowitoliczbowe.
SELECT
10 / 4 AS ten_div_four,
9 / 2 AS nine_div_two,
1 / 3 AS one_div_three,
6 / 6 AS six_div_six;Rozwiązanie za pomocą CAST
Najpewniejszym sposobem wymuszenia dzielenia dziesiętnego jest rzutowanie co najmniej jednego operandu na typ dziesiętny. CAST(value AS DECIMAL) lub CAST(value AS NUMERIC) informuje SQL, aby traktował tę liczbę jako wartość zmiennoprzecinkową, dzięki czemu dzielenie zwróci precyzyjny wynik.
SELECT CAST(1 AS DECIMAL) / 2 AS result;CAST po obu stronach
Do uzyskania wyniku dziesiętnego wystarczy rzutować jedną stronę dzielenia — SQL automatycznie dostosuje typ drugiego operandu. Rzutowanie obu stron sprawia jednak, że intencja jest jednoznaczna i ułatwia późniejsze czytanie kodu.
SELECT
CAST(7 AS DECIMAL) / CAST(3 AS DECIMAL) AS both_cast,
CAST(7 AS DECIMAL) / 3 AS one_cast;Używanie literału dziesiętnego
Innym szybkim sposobem jest zapisanie jednego operandu jako literału dziesiętnego przez dodanie .0. SQL rozpoznaje 1.0 jako liczbę dziesiętną, co wymusza arytmetykę dziesiętną w całym wyrażeniu.
Jest to wygodne w szybkich zapytaniach ad hoc, ale w kodzie produkcyjnym zapis CAST jest czytelniejszy.
SELECT 1.0 / 2 AS decimal_result,
7.0 / 3 AS another_result;Pułapka z życia: dane w kolumnach
Problem staje się naprawdę dotkliwy podczas pracy z kolumnami całkowitoliczbowymi. Wyobraźmy sobie tabelę śledzącą cele sprzedażowe. Dzielenie kolumn całkowitoliczbowych daje wyniki całkowite — współczynnik konwersji wyniesie 0, choć powinien wynosić 0.75!
CREATE TABLE sales_targets (
rep TEXT,
achieved INT,
target INT
);
INSERT INTO sales_targets VALUES
('Alice', 75, 100),
('Bob', 3, 4),
('Carol', 9, 10);
SELECT rep,
achieved / target AS wrong_rate
FROM sales_targets;Naprawianie dzielenia kolumn
Zastosuj CAST do kolumny licznika, a dzielenie zwróci teraz rzeczywisty współczynnik konwersji w postaci liczby dziesiętnej. Mianownik zostanie automatycznie przekonwertowany.
Późniejsze pomnożenie przez 100.0 da wynik procentowy — przez cały czas używana jest arytmetyka dziesiętna.
SELECT rep,
CAST(achieved AS DECIMAL) / target AS conversion_rate,
CAST(achieved AS DECIMAL) / target * 100.0 AS pct
FROM sales_targets;Kontrolowanie precyzji liczb dziesiętnych
Można kontrolować liczbę przechowywanych miejsc dziesiętnych, określając precyzję i skalę w rzutowaniu: DECIMAL(10, 2) oznacza maksymalnie 10 cyfr łącznie, z czego 2 znajdują się po przecinku dziesiętnym. Jest to przydatne, gdy potrzebny jest przejrzysty, zaokrąglony wynik zamiast wielu końcowych cyfr.
SELECT CAST(CAST(1 AS DECIMAL(10,4)) / 3 AS DECIMAL(10,2)) AS rounded_result;ROUND po dzieleniu
Czasami potrzebne jest wykonywanie obliczeń z pełną precyzją, a następnie zaokrąglenie końcowej wyświetlanej wartości. Funkcja ROUND przyjmuje wartość oraz liczbę miejsc dziesiętnych, które należy zachować.
Najpierw należy zawsze wykonać dzielenie (z użyciem arytmetyki dziesiętnej), a dopiero potem zaokrąglać — nigdy nie należy zaokrąglać przed dzieleniem.
SELECT
ROUND(CAST(1 AS DECIMAL) / 3, 4) AS four_places,
ROUND(CAST(1 AS DECIMAL) / 3, 2) AS two_places,
ROUND(CAST(1 AS DECIMAL) / 3, 0) AS zero_places;Dzielenie całkowite może być przydatne
Dzielenie całkowite nie zawsze jest błędem — czasami jest dokładnie tym, czego potrzeba. Na przykład przeliczanie łącznej liczby minut na pełne godziny celowo wykorzystuje dzielenie całkowite. Najważniejsze jest świadome wybranie dzielenia całkowitego lub dziesiętnego, zamiast przypadkowego uzyskania jednego z tych rodzajów.
SELECT
137 / 60 AS full_hours,
137 % 60 AS remaining_minutes;Szybki test
Sprawdź swoją wiedzę na temat dzielenia całkowitego i dziesiętnego w SQL.
Podsumowanie lekcji
W tej lekcji poznano sposób, w jaki SQL obsługuje dzielenie liczb całkowitych:
- Integer / Integer obcina wynik — część dziesiętna jest tracona bez ostrzeżenia.
- Użyj
CAST(value AS DECIMAL)dla co najmniej jednego operandu, aby wymusić dzielenie dziesiętne. - Zapisanie literału dziesiętnego, takiego jak
1.0, również promuje wyrażenie do arytmetyki dziesiętnej. - Użyj
ROUNDpo dzieleniu, aby kontrolować liczbę wyświetlanych miejsc dziesiętnych. - Dzielenie całkowite bywa zamierzone (np. przy przeliczaniu minut na godziny), ale zawsze należy wybierać je świadomie, a nie uzyskiwać przypadkowo.
Należy uważać na tę pułapkę za każdym razem, gdy dzielone są kolumny całkowite — jest to jedno z najczęstszych źródeł cichych, trudnych do wykrycia błędów w zapytaniach SQL.
Często zadawane pytania
Czy lekcja „Dzielenie całkowite a dziesiętne” jest bezpłatna?
Tak — pełny tekst „Dzielenie całkowite a dziesiętne” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Dzielenie całkowite a dziesiętne”?
Unikaj zaskakujących wyników dzięki rzutowaniu typów Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Dzielenie całkowite a dziesiętne”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Działania arytmetyczne i operatory
- Zaokrąglanie i obcinanie
- Dzielenie całkowite a dziesiętne
- Przydatne funkcje matematyczne