Ganzzahlen und Dezimalzahlen
In Lektion 2 hast du gesehen, dass 25 / 2 den Wert 12 ergibt und nicht 12,5. Diese Falle überrascht fast jeden, also schauen wir uns an, warum das so ist und was du dagegen tun kannst. Dafür brauchst du nicht einmal eine Tabelle: Ein SELECT ohne FROM rechnet einfach aus, was du hineinschreibst, du kannst es also als Taschenrechner benutzen:
SELECT 7 / 2;| 7 / 2 |
|---|
| 3 |
Nicht 3,5, sondern 3. SQLite kennt zwei Arten von Zahlen: Ganzzahlen (der Typ INTEGER), wie 7 oder 40, und Dezimalzahlen (der Typ REAL), wie 3.5 oder 40.0. Sind beide Zahlen einer Division ganze Zahlen, ist auch das Ergebnis eine Ganzzahl, und was nach dem Komma käme, wird abgeschnitten. Es wird nichts aufgerundet: 7 / 2 ist 3, 9 / 10 ist 0 und -7 / 2 ist -3. (Mathematiker sagen, dass in Richtung Null gerundet wird.)
Sobald eine der beiden Zahlen eine Dezimalzahl ist, ist es auch das Ergebnis. Wenn du das genaue Ergebnis brauchst, schreibe also eine der Zahlen mit .0:
SELECT 7 / 2.0, 7.0 / 2;| 7 / 2.0 | 7.0 / 2 |
|---|---|
| 3.5 | 3.5 |
Das ist im Pixel Shop wichtig, denn die Preise sind Ganzzahlen (die Spalte preis ist INTEGER). Hier ist die Hälfte jedes Preises, einmal durch 2 und einmal durch 2.0 geteilt:
SELECT titel, preis, preis / 2 AS halb_ganz, preis / 2.0 AS halb
FROM spiele
LIMIT 3;| titel | preis | halb_ganz | halb |
|---|---|---|---|
| Dragon Forge | 40 | 20 | 20.0 |
| Pixel Racer | 15 | 7 | 7.5 |
| Moon Farm | 20 | 10 | 10.0 |
Die Hälfte von 15 € sind 7,50 €, aber preis / 2 sagt 7. Beachte auch, wie SQLite Dezimalzahlen schreibt: 20.0 ist eine Dezimalzahl, die zufällig ganz ist, und das .0 verrät es. Lange Ergebnisse werden mit bis zu 15 Ziffern angezeigt: 10 / 3.0 ist 3.33333333333333. In der nächsten Übung lernst du, sie zu runden.
Eine andere Möglichkeit ist, zuerst mit 1.0 zu multiplizieren: preis * 1.0 / 2. Die Multiplikation mit 1.0 ändert den Wert nicht, sie macht ihn nur zu einer Dezimalzahl. So gehst du vor, wenn beide Zahlen einer Division Spalten sind und es keine Zahl gibt, an die du ein .0 hängen könntest. Aber es muss zuerst kommen: In preis / 2 * 1.0 hat die Division die Hälfte schon abgeschnitten, und du bekommst 7.0.
Der Operator % liefert den Rest einer Ganzzahldivision, also das, was übrig bleibt. 135 Minuten sind 2 Stunden und 15 Minuten:
SELECT 135 / 60 AS stunden, 135 % 60 AS minuten;| stunden | minuten |
|---|---|
| 2 | 15 |
Die Ganzzahldivision ist also kein Fehler, sondern eine andere Art der Division, und manchmal ist sie genau das, was du brauchst: Stunden und Minuten, volle Kartons und die übrigen Exemplare oder gerade und ungerade Zahlen (id % 2 ist 0 für gerade IDs und 1 für ungerade). Beachte, dass % in SQL den Rest bedeutet, nicht Prozent.
Typischer Fehler: ein Prozentsatz mit Ganzzahlen. 15 Prozent eines Preises sind nicht preis / 100 * 15: Für jeden Preis unter 100 € ist preis / 100 gleich 0, und damit auch das Ergebnis. Schreibe preis * 15 / 100.0 oder einfach preis * 0.15.
So schreibst du es:
Anweisungen
- 1
Pixel Shop möchte, dass Kunden in 4 Monatsraten zahlen können. Zeige den Titel, den Preis und den durch 4 geteilten Preis mit seinen Nachkommastellen als
rate. Sortiere die Spiele nach dem Preis, den höchsten zuerst, und Spiele mit demselben Preis nach dem Titel:titel preis rate Knight's Oath 60 15.0 Goal Rush 50 12.5 Ice Hockey Pro 45 11.25 … … … - 2
Füge darunter eine Abfrage für den 100-€-Gutschein des Shops hinzu: Zeige den Titel, den Preis, wie viele Exemplare des Spiels man mit dem Gutschein kaufen kann als
exemplareund wie viele Euro auf dem Gutschein übrig bleiben alsrest. Sortiere die Spiele nach dem Preis, den niedrigsten zuerst, und Spiele mit demselben Preis nach dem Titel:titel preis exemplare rest Cube Logic 5 20 0 Word Quest 10 10 0 Bakery Story 15 6 10 … … … …