SQL Academy · leksjon

Heltallsdivisjon kontra desimaldivisjon

Unngå overraskende resultater med typekonvertering.

Leksjon 3 av 413 trinn

Heltallsdivisjon kontra desimaldivisjon er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Et overraskende resultat

La oss begynne med en oppgave. Hva tror du følgende spørring returnerer?

Hvis du forventer 0.5, blir du kanskje overrasket. I mange SQL-databaser gir divisjon av to heltall et heltallsresultat – desimaldelen forkastes fullstendig.

SELECT 1 / 2 AS result;

Heltallsdivisjon forklart

Når begge operandene i en divisjon er heltall, utfører SQL heltallsdivisjon. Resultatet avkortes mot null — ingen avrunding, bare heltallsdelen.

Dermed blir 1 / 2 = 0, 7 / 3 = 2 og 9 / 4 = 2. Brøkdelen forkastes uten videre.

SELECT 7 / 3 AS truncated_result;

Flere eksempler på heltallsdivisjon

Her er flere eksempler på heltallsdivisjon i én spørring. Legg merke til at alle resultatene mister desimaldelen. Denne oppførselen er konsekvent i uttrykk som bare inneholder heltallsliteraler eller heltallskolonner.

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;

Løs det med CAST

Den mest pålitelige måten å tvinge frem desimaldivisjon på er å caste minst én operand til en desimaltallstype. CAST(value AS DECIMAL) eller CAST(value AS NUMERIC) forteller SQL at tallet skal behandles som en flyttallsverdi, slik at divisjonen gir et presist resultat.

SELECT CAST(1 AS DECIMAL) / 2 AS result;

CAST på begge sider

Du trenger bare å caste én side av divisjonen for å få et desimalresultat — SQL løfter automatisk den andre operanden til samme type. Å caste begge sidene gjør imidlertid hensikten tydelig og unngår forvirring når koden leses senere.

SELECT
  CAST(7 AS DECIMAL) / CAST(3 AS DECIMAL) AS both_cast,
  CAST(7 AS DECIMAL) / 3                   AS one_cast;

Bruk en desimalliteral

Et annet raskt triks er å skrive én operand som en desimalliteral ved å legge til .0. SQL tolker 1.0 som et desimaltall, noe som tvinger frem desimale beregninger for hele uttrykket.

Dette er praktisk for raske ad hoc-spørringer, men CAST er tydeligere i produksjonskode.

SELECT 1.0 / 2  AS decimal_result,
       7.0 / 3  AS another_result;

Virkelig fallgruve: kolonnedata

Problemet blir virkelig tydelig når du arbeider med heltallskolonner. Se for deg en tabell som holder oversikt over salgsmål. Divisjon av heltallskolonner gir heltallsresultater — en konverteringsrate på 0 når den burde være 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;

Korrigere divisjon mellom kolonner

Bruk CAST på tellernkolonnen, så returnerer divisjonen nå den faktiske konverteringsraten som et desimaltall. Nevneren konverteres automatisk til desimal.

Hvis du multipliserer med 100.0 etterpå, får du en prosentandel – og bruker fortsatt desimalaritmetikk gjennom hele beregningen.

SELECT rep,
       CAST(achieved AS DECIMAL) / target          AS conversion_rate,
       CAST(achieved AS DECIMAL) / target * 100.0  AS pct
FROM   sales_targets;

Kontrollere desimalpresisjon

Du kan kontrollere hvor mange desimalplasser som lagres, ved å angi presisjon og skala i casten: DECIMAL(10, 2) betyr opptil 10 sifre totalt, hvorav 2 står etter desimaltegnet. Dette er nyttig når du ønsker et ryddig, avrundet resultat i stedet for mange etterfølgende sifre.

SELECT CAST(CAST(1 AS DECIMAL(10,4)) / 3 AS DECIMAL(10,2)) AS rounded_result;

ROUND etter divisjon

Noen ganger ønsker du å beregne med full presisjon internt og deretter avrunde den endelige visningsverdien. Funksjonen ROUND tar verdien og antallet desimalplasser du vil beholde.

Del alltid først (med desimalaritmetikk), og rund deretter av – rund aldri av før du deler.

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;

Heltallsdivisjon kan være nyttig

Heltallsdivisjon er ikke alltid en feil – noen ganger er det akkurat det du trenger. Når du for eksempel konverterer et totalt antall minutter til hele timer, bruker du heltallsdivisjon med hensikt. Det viktigste er å velge heltallsdivisjon eller desimaldivisjon bevisst, i stedet for å ende opp med den ene eller den andre ved et uhell.

SELECT
  137 / 60  AS full_hours,
  137 % 60  AS remaining_minutes;

Kort sjekk

Test forståelsen din av heltallsdivisjon kontra desimaldivisjon i SQL.

Oppsummering av leksjonen

I denne leksjonen har du lært hvordan SQL håndterer divisjon mellom heltall:

  • Integer / Integer avkorter resultatet – desimaldelen går lydløst tapt.
  • Bruk CAST(value AS DECIMAL) på minst én operand for å tvinge frem desimaldivisjon.
  • En desimalliteral som 1.0 gjør også at uttrykket bruker desimalaritmetikk.
  • Bruk ROUND etter divisjonen for å kontrollere antallet viste desimalplasser.
  • Heltallsdivisjon kan noen ganger være tilsiktet, for eksempel når minutter konverteres til timer, men gjør alltid dette til et bevisst valg i stedet for et uhell.

Vær oppmerksom på denne fellen hver gang du deler heltallskolonner – den er en av de vanligste kildene til lydløse feil som er vanskelige å oppdage, i SQL-spørringer.

Gratis å komme i gang

Lær deg SQL med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
46
Leksjoner
183

Ofte stilte spørsmål

Er leksjonen «Heltallsdivisjon kontra desimaldivisjon» gratis?

Ja – hele teksten i «Heltallsdivisjon kontra desimaldivisjon» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Heltallsdivisjon kontra desimaldivisjon»?

Unngå overraskende resultater med typekonvertering. Du øver på SQL Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med SQL Academy?

Ingen tidligere erfaring er nødvendig. SQL Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Heltallsdivisjon kontra desimaldivisjon»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne SQL Academy-leksjonen?

Ja. Alle SQL Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Aritmetikk og operatorer
  2. Avrunding og avkorting
  3. Heltallsdivisjon kontra desimaldivisjon
  4. Nyttige matematiske funksjoner
← Tilbake til SQL Academy