Menu

SQLite SELECT: Spalten, Ausdrücke und Aliase

Wie das SELECT-Statement in SQLite wirklich funktioniert: Spalten auswählen, Ausdrücke berechnen, Aliase setzen – und das mentale Modell hinter jeder Query, die du je schreiben wirst.

Diese Seite enthält ausführbare Editoren — bearbeiten, ausführen und Ausgabe sofort sehen.

SELECT liest Zeilen aus einer Tabelle

Jede Abfrage an eine SQLite-Datenbank beginnt mit SELECT. Damit sagst du der Datenbank: gib mir diese Spalten, aus dieser Tabelle, für die Zeilen, die folgenden Bedingungen entsprechen. Heute schauen wir uns die ersten beiden Teile an — Spalten und Tabelle. Das Filtern kommt im nächsten Dokument.

Die einfachste denkbare SQLite-Abfrage:

SELECT * heißt "alle Spalten". FROM products gibt die Tabelle an. Das Ergebnis: pro Datensatz eine Zeile mit allen vier Spalten. Das Semikolon schließt die Anweisung ab.

Mehr steckt nicht dahinter: SELECT <Spalten> FROM <Tabelle>;.

Bestimmte Spalten in SQLite auswählen

* ist praktisch, wenn man sich erst einmal umschauen will. In echtem Code willst du aber fast immer genau die Spalten benennen, die du tatsächlich brauchst:

Du bekommst zwei Spalten zurück – und zwar in genau der Reihenfolge, in der du sie angefordert hast. Die Reihenfolge in der SELECT-Liste bestimmt also die Reihenfolge im Ergebnis und muss nicht mit der Spaltenreihenfolge in der Tabelle übereinstimmen.

Warum ist das besser als SELECT *? Aus zwei Gründen. Erstens werden weniger Daten übertragen (bzw. aus der Datei gelesen), was bei breiten Tabellen schnell ins Gewicht fällt. Zweitens bleibt deine Abfrage stabil, wenn jemand nächsten Monat eine neue Spalte hinzufügt. SELECT * liefert dann klammheimlich mehr Daten zurück – und das kann Anwendungscode kaputtmachen, der Zeilen über die Position auspackt.

SELECT kann nicht nur abfragen, sondern auch berechnen

Die Einträge in der SELECT-Liste müssen keine reinen Spaltennamen sein. Erlaubt ist jeder beliebige Ausdruck – Arithmetik, Funktionsaufrufe, String-Verkettung, Konstanten. SQLite wertet den Ausdruck für jede Zeile aus.

Die vierte Spalte existiert in der Tabelle gar nicht – SQLite berechnet sie Zeile für Zeile. Genauso kannst du mit String-Funktionen, Datumswerten oder bedingten Ausdrücken arbeiten – im Grunde mit allem, was SQL hergibt. Die SELECT-Liste ist also nicht nur dazu da, Daten abzurufen, sondern auch, um sie passend zu formen.

Du kannst SELECT sogar ganz ohne FROM-Klausel verwenden und SQLite damit wie einen Taschenrechner einsetzen:

Eine Zeile, drei Spalten. Praktisch, wenn du erst mal ausprobieren willst, was ein Ausdruck eigentlich tut, bevor du ihn in eine echte Abfrage einbaust.

Spalten umbenennen mit AS

Sobald du eine Spalte berechnest, vergibt SQLite automatisch einen Namen dafür – meistens den Ausdruck selbst, also so etwas wie price * stock. Das sieht nicht nur unschön aus, sondern ist auch unzuverlässig. Mit dem Schlüsselwort AS gibst du der Spalte einen sauberen Namen:

Der Alias bestimmt den Spaltennamen im Ergebnis. Das verbessert nicht nur die Lesbarkeit beim Durchschauen der Ausgabe, sondern ist vor allem im Anwendungscode entscheidend, wenn du Werte über den Spaltennamen abgreifst (row["inventory_value"] statt row[1]).

Das Schlüsselwort AS ist optional — price * stock inventory_value funktioniert genauso. Trotzdem: Schreib es aus. Die Absicht wird dadurch klarer, und du vermeidest, dass jemand ein fehlendes Komma versehentlich für einen Alias hält.

Auch die Tabelle mit einem Alias versehen

Du kannst genauso gut der Tabelle selbst einen kurzen Alias geben. Bei einer einzelnen Tabelle bringt das wenig, aber sobald JOINs ins Spiel kommen, zahlt sich diese Gewohnheit sofort aus:

p steht hier stellvertretend für products. Die Punktnotation p.name macht klar, aus welcher Tabelle eine Spalte stammt. Bei einer einzelnen Tabelle ist das nur Ballast – sobald aber drei Tabellen per Join zusammenkommen, hält genau diese Schreibweise die Abfrage überhaupt erst lesbar.

Literale und Konstanten im Ergebnis

In einem SQLite SELECT kannst du echte Spalten mit festen Werten kombinieren. Das ist praktisch, wenn du Zeilen markieren oder einen Platzhalter einsetzen willst:

Jede Zeile bekommt dasselbe 'USD' und 1. Dieses Muster taucht typischerweise dann auf, wenn du Ergebnisse aus mehreren Abfragen mit UNION zusammenführst und eine Markierungsspalte brauchst, um die Quellen voneinander unterscheiden zu können.

Kurz zu NULL

Manche Spalten sind leer — entweder wurde kein Wert eingefügt, oder die Spalte hat keinen Standardwert. SQLite stellt "kein Wert" als NULL dar, und NULL erscheint in den SELECT-Ergebnissen je nach Tool entweder als leeres Feld oder als das Wort NULL.

Schau dir die zweite Zeile an. price ist NULL, und price * 2 ist ebenfalls NULL — jede Rechenoperation mit NULL ergibt wieder NULL. Das ist eine der häufigsten Stolperfallen bei SQL-Ergebnissen und bekommt später eine eigene Seite. Merk dir vorerst nur: NULL steckt sich durch Ausdrücke hindurch an.

Was du mitnimmst

  • SELECT <Spalten> FROM <Tabelle>; ist die Grundform jeder Abfrage.
  • In echtem Code immer die Spalten explizit auflisten; SELECT * ist nur zum Erkunden gedacht.
  • In der SELECT-Liste darf jeder beliebige Ausdruck stehen, nicht nur Spaltennamen.
  • Mit AS gibst du berechneten Spalten und Tabellen-Aliassen sprechende Namen.
  • NULL zieht sich durch jede Rechnung — denk daran, wenn die Ergebnisse seltsam aussehen.

Als Nächstes: Zeilen filtern mit WHERE

Bisher liefert jede Abfrage sämtliche Zeilen der Tabelle zurück. Mit der WHERE-Klausel grenzt du das Ergebnis ein — nach Preis, nach Name, nach Datum oder nach jedem Ausdruck, der wahr oder falsch ergibt. Genau darum geht es im nächsten Kapitel.

Häufig gestellte Fragen

Wie sieht die Grundsyntax von SELECT in SQLite aus?

SELECT <spalten> FROM <tabelle>;. Bei den Spalten kannst du eine kommagetrennte Liste angeben (SELECT name, email FROM users), mit * alle Spalten holen oder beliebige Ausdrücke wie price * quantity berechnen lassen. Das FROM benennt die Tabelle, aus der gelesen wird, und das Semikolon schließt das Statement ab.

Sollte ich SELECT * in SQLite überhaupt benutzen?

In der CLI zum Reinschnuppern völlig okay – da willst du ja sehen, was in der Tabelle steckt. Im Produktivcode dagegen besser nur die Spalten auflisten, die du wirklich brauchst. SELECT * koppelt deinen Code fest an das aktuelle Schema: Kommt morgen eine Spalte dazu, liefert jede Query klammheimlich mehr Daten zurück – und Code, der Zeilen nach Position auspackt, fliegt dir um die Ohren.

Wie benenne ich eine Spalte im SELECT-Ergebnis um?

Mit AS vergibst du einen Alias für eine Spalte oder einen Ausdruck: SELECT price * quantity AS total FROM orders. Der Alias wird zum Spaltennamen im Resultset – wichtig für die Lesbarkeit und für Code, der Ergebnisse über den Spaltennamen ausliest. Das Schlüsselwort AS ist zwar optional, aber der Klarheit zuliebe würde ich es immer hinschreiben.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S