Celá a desetinná čísla
Ve 2. lekci jste viděli, že 25 / 2 dá 12, a ne 12,5. Tenhle háček překvapí skoro každého, a tak se podívejme, proč se to děje a co s tím. Nepotřebujete k tomu ani tabulku: SELECT bez FROM prostě spočítá, co mu napíšete, takže ho můžete používat jako kalkulačku:
SELECT 7 / 2;| 7 / 2 |
|---|
| 3 |
Ne 3,5, ale 3. SQLite má dva druhy čísel: celá čísla (typ INTEGER), třeba 7 nebo 999, a desetinná čísla (typ REAL), třeba 3.5 nebo 999.0. Když jsou obě čísla v dělení celá, je celé i výsledek a to, co by bylo za desetinnou čárkou, se prostě zahodí. Nic se nezaokrouhluje nahoru: 7 / 2 je 3, 9 / 10 je 0 a -7 / 2 je -3. (Matematik by řekl, že se zaokrouhluje směrem k nule.)
Jakmile je aspoň jedno z obou čísel desetinné, je desetinný i výsledek. Když tedy potřebujete přesný výsledek, napište jedno z čísel s .0:
SELECT 7 / 2.0, 7.0 / 2;| 7 / 2.0 | 7.0 / 2 |
|---|---|
| 3.5 | 3.5 |
Desetinná čísla se v SQL píšou s tečkou, ne s čárkou, a s tečkou je SQLite také vypisuje. Zápis 3,5 by SQL přečetlo jako dvě čísla, 3 a 5.
V obchodě Pixel Shop na tom záleží, protože ceny jsou celá čísla (sloupec cena je INTEGER). Tady je polovina každé ceny, jednou dělená 2, podruhé 2.0:
SELECT nazev, cena, cena / 2 AS polovina_cela, cena / 2.0 AS polovina
FROM hry
LIMIT 3;| nazev | cena | polovina_cela | polovina |
|---|---|---|---|
| Dragon Forge | 999 | 499 | 499.5 |
| Pixel Racer | 399 | 199 | 199.5 |
| Moon Farm | 499 | 249 | 249.5 |
Polovina z 999 Kč je 499,50 Kč, ale cena / 2 tvrdí, že 499. Všimněte si také, jak SQLite desetinná čísla vypisuje: desetinné číslo, které vyjde celé, píše s .0 na konci, třeba 500.0, aby bylo poznat, že je desetinné. Dlouhé výsledky ukazuje nejvýš na 15 číslic: 10 / 3.0 je 3.33333333333333. Jak je zaokrouhlit, se naučíte v dalším cvičení.
Jiná možnost je číslo nejdřív vynásobit 1.0: cena * 1.0 / 2. Násobení 1.0 hodnotu nezmění, jen z ní udělá desetinné číslo. Hodí se, když jsou obě čísla v dělení sloupce a není k čemu .0 připsat. Musí ale přijít jako první: v cena / 2 * 1.0 už dělení polovinu zahodilo a vyjde 499.0.
Operátor % dává zbytek po celočíselném dělení, tedy to, co zbude. 135 minut jsou 2 hodiny a 15 minut:
SELECT 135 / 60 AS hodiny, 135 % 60 AS minuty;| hodiny | minuty |
|---|---|
| 2 | 15 |
Celočíselné dělení tedy není chyba, jen jiný druh dělení, a někdy je přesně tím, co potřebujete: hodiny a minuty, plné krabice a kusy, které zbudou, nebo sudá a lichá čísla (id % 2 je 0 pro sudá ID a 1 pro lichá). % v SQL znamená zbytek, ne procenta.
Typická chyba: procenta s celými čísly. 15 % z ceny není cena / 100 * 15: u hry za 999 Kč je cena / 100 jen 9 a výsledek je 135 místo 149,85. Napište cena * 15 / 100.0 nebo prostě cena * 0.15.
Jak psát:
Pokyny
Pixel Shop chce zákazníkům nabídnout placení ve 4 měsíčních splátkách. Ukažte název, cenu a cenu dělenou 4 jako splatka, i s desetinnou částí. Hry seřaďte podle ceny od nejvyšší, hry se stejnou cenou podle názvu:
| nazev | cena | splatka |
|---|---|---|
| Knight's Oath | 1599 | 399.75 |
| Goal Rush | 1299 | 324.75 |
| Ice Hockey Pro | 1199 | 299.75 |
| … | … | … |
Pod něj přidejte dotaz pro dárkový poukaz obchodu na 2000 Kč: ukažte název, cenu, počet kusů hry, které se za poukaz dají koupit, jako kusu a počet korun, které na poukazu zbydou, jako zbyde. Hry seřaďte podle ceny od nejnižší, hry se stejnou cenou podle názvu:
| nazev | cena | kusu | zbyde |
|---|---|---|---|
| Cube Logic | 129 | 15 | 65 |
| Word Quest | 249 | 8 | 8 |
| Bakery Story | 399 | 5 | 5 |
| … | … | … | … |
Začněte programovat zdarma
1/10