Kokonaisluku- ja desimaalijako
Välttäkää tyyppimuunnosten yllättävät tulokset.
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ä.
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
- Aritmetiikka ja operaattorit
- Pyöristäminen ja katkaiseminen
- Kokonaisluku- ja desimaalijako
- Hyödylliset matemaattiset funktiot