SQL Academy · Oppitunti

Kokonaisluku- ja desimaalijako

Välttäkää tyyppimuunnosten yllättävät tulokset.

Oppitunti 3/413 vaihetta

Kokonaisluku- ja desimaalijako on ilmainen SQL Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Yllättävä tulos

Aloitetaan pulmatehtävällä. Mitä luulet seuraavan kyselyn palauttavan?

Jos odotat tulosta 0.5, saatat yllättyä. Monissa SQL-tietokannoissa kahden kokonaisluvun jakaminen tuottaa kokonaisluvun, jolloin desimaaliosa katoaa kokonaan.

SELECT 1 / 2 AS result;

Kokonaislukujen jakolasku selitettynä

Kun jakolaskun molemmat operandit ovat kokonaislukuja, SQL suorittaa kokonaislukujen jakolaskun. Tulos katkaistaan kohti nollaa: sitä ei pyöristetä, vaan siitä säilytetään vain kokonaislukuosa.

Siksi 1 / 2 = 0, 7 / 3 = 2 ja 9 / 4 = 2. Murto-osa hylätään huomaamatta.

SELECT 7 / 3 AS truncated_result;

Lisää esimerkkejä kokonaislukujen jakolaskusta

Tässä on useita kokonaislukujen jakolaskun esimerkkejä yhdessä kyselyssä. Huomaa, miten kaikista tuloksista katoaa desimaaliosa. Tämä toiminta on yhdenmukaista kaikissa lausekkeissa, joissa käytetään vain kokonaislukuliteraaleja tai kokonaislukusarakkeita.

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;

Korjaaminen CAST-funktiolla

Luotettavin tapa pakottaa jakolasku desimaalilaskennaksi on muuntaa tyyppi vähintään yhdelle operandille desimaalitietotyypiksi. CAST(value AS DECIMAL) tai CAST(value AS NUMERIC) käskee SQL:ää käsittelemään lukua liukulukuna, jolloin jakolasku palauttaa tarkan tuloksen.

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

CAST-muunnos molemmille puolille

Sinun tarvitsee muuntaa vain toisen puolen tyyppi saadaksesi desimaalituloksen — SQL muuntaa toisen operandin tyypin automaattisesti. Molempien puolten muuntaminen tekee kuitenkin tarkoituksesta selvän ja ehkäisee sekaannuksia, kun koodia luetaan myöhemmin.

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

Desimaaliliteraalin käyttäminen

Toinen nopea keino on kirjoittaa toinen operandi desimaaliliteraalina lisäämällä .0. SQL tulkitsee 1.0:n desimaaliluvuksi, mikä pakottaa koko lausekkeen desimaalilaskentaan.

Tämä on kätevää nopeissa tilapäisissä kyselyissä, mutta CAST on tuotantokoodissa selkeämpi.

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

Tosielämän ongelma: sarakkeiden tiedot

Ongelma korostuu erityisesti kokonaislukusarakkeita käsiteltäessä. Kuvittele taulu, jossa seurataan myyntitavoitteita. Kokonaislukusarakkeiden jakaminen tuottaa kokonaislukutuloksia — muuntosuhteeksi saadaan 0, vaikka sen pitäisi olla 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;

Sarakkeiden jakolaskun korjaaminen

Kun käytätte osoittajasarakkeeseen CAST-muunnosta, jakolasku palauttaa nyt todellisen muuntosuhteen desimaalilukuna. Nimittäjä muunnetaan automaattisesti.

Kun kerrotte tuloksen tämän jälkeen luvulla 100.0, saatte prosenttiosuuden — laskennassa käytetään edelleen desimaaliaritmetiikkaa.

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

Desimaalitarkkuuden hallinta

Voitte määrittää tallennettavien desimaalien määrän määrittämällä castissa tarkkuuden ja skaalan: DECIMAL(10, 2) tarkoittaa enintään 10 numeroa yhteensä, joista 2 on desimaalipilkun jälkeen. Tämä on hyödyllistä, kun haluatte siistin, pyöristetyn tulosteen monien peräkkäisten desimaalien sijaan.

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

ROUND jakolaskun jälkeen

Joskus haluatte laskea sisäisesti täydellä tarkkuudella ja pyöristää vasta lopullisen näytettävän arvon. ROUND-funktio ottaa arvon ja säilytettävien desimaalien määrän.

Jakakaa aina ensin desimaaliaritmetiikkaa käyttäen ja pyöristäkää vasta sitten — älkää koskaan pyöristäkö ennen jakamista.

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;

Kokonaislukujakolasku voi olla hyödyllinen

Kokonaislukujakolasku ei ole aina virhe — joskus se on juuri sitä, mitä tarvitsette. Esimerkiksi minuuttien kokonaismäärän muuntaminen kokonaisiksi tunneiksi tehdään tarkoituksella kokonaislukujakolaskulla. Tärkeintä on valita kokonaisluku- tai desimaalijakolasku tietoisesti sen sijaan, että päätyisitte siihen vahingossa.

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

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte kokonaisluku- ja desimaalijakolaskun eron SQL:ssä.

Oppitunnin yhteenveto

Tässä oppitunnissa opitte, miten SQL käsittelee kokonaislukujen välistä jakolaskua:

  • Integer / Integer katkaisee tuloksen — desimaaliosa menetetään huomaamatta.
  • Käyttäkää vähintään yhteen operandiin CAST(value AS DECIMAL) -muunnosta pakottaaksenne desimaalijakolaskun käyttöön.
  • Myös desimaalivakion, kuten 1.0, kirjoittaminen muuttaa lausekkeen desimaaliaritmetiikaksi.
  • Käyttäkää jakolaskun jälkeen ROUND-funktiota hallitaksenne näytettävien desimaalien määrää.
  • Kokonaislukujakolasku on joskus tarkoituksellinen valinta (esimerkiksi minuutteja tunneiksi muunnettaessa), mutta tehkää siitä aina tietoinen valinta älkääkä päätykö siihen vahingossa.

Varokaa tätä sudenkuoppaa aina jakaessanne kokonaislukusarakkeita — se on yksi yleisimmistä SQL-kyselyiden huomaamattomien ja vaikeasti havaittavien virheiden lähteistä.

Aloita maksutta

Opi SQL tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
46
Oppitunnit
183

Usein kysytyt kysymykset

Onko oppitunti ”Kokonaisluku- ja desimaalijako” ilmainen?

Kyllä – oppitunnin ”Kokonaisluku- ja desimaalijako” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL Academy-kurssin, päivitä CoddyKit PROhon. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Kokonaisluku- ja desimaalijako”?

Välttäkää tyyppimuunnosten yllättävät tulokset. Harjoittelet SQL Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni SQL Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin SQL Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Kokonaisluku- ja desimaalijako”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä SQL Academy-oppitunnilla?

Kyllä. Jokainen SQL Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Aritmetiikka ja operaattorit
  2. Pyöristäminen ja katkaiseminen
  3. Kokonaisluku- ja desimaalijako
  4. Hyödylliset matemaattiset funktiot
← Takaisin: SQL Academy