Wie fragt man eine CSV-Datei mit SQL ab?
Eine CSV-Datei (englisch comma-separated values, Werte durch Kommas getrennt) enthält eine Tabelle als reinen Text. Mit DuckDB fragen Sie sie über ihren Namen ab, ohne sie vorher in eine Datenbank zu laden.
Das spart den Import, wenn Daten als Export einer Kasse oder einer Umfrage ankommen.
Am Ende dieser Lektion
Notiz
Ich kann eine CSV-Datei über ihren Namen mit SQL abfragen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| CSV-Datei | eine Textdatei, in der jede Zeile eine Tabellenzeile ist | |
| Kopfzeile | die erste Zeile mit den Namen der Spalten | |
| read_csv | liest eine CSV-Datei wie eine Tabelle | read_csv('bestellungen.csv') |
| Typerkennung | DuckDB schließt aus den Werten auf den Typ jeder Spalte | |
| Spaltentyp | sagt, ob eine Spalte Zahlen, Text oder Daten hält | BIGINT |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Datei verhält sich wie eine Tabelle
Die Funktion read_csv liest eine CSV-Datei und gibt sie als Tabelle zurück. Die Kopfzeile liefert die Spaltennamen.
Danach nutzen Sie die Datei in from wie jede Tabelle: mit where, group by und Fensterfunktionen.
In der Spielwiese laden Sie dazu eine eigene CSV-, TSV- oder JSON-Lines-Datei bis 64 KB hoch. Parquet-Dateien gibt es dort nicht.
So sieht die Datei aus
id,tag,kundin,produkt,menge,preis_cent
1,2026-06-01,Lena,Heft,3,250
2,2026-06-01,Murat,Stift,10,80
3,2026-06-02,Lena,Ordner,2,420
4,2026-06-03,Sofia,Heft,5,250
5,2026-06-03,Murat,Ordner,1,420So fragen Sie sie ab
-- So fragen Sie die Datei ab (mit hochgeladener Datei).
select produkt, sum(menge) as stueck
from read_csv('bestellungen.csv')
group by produkt
order by produkt;DuckDB rät den Typ jeder Spalte
Eine CSV-Datei hat keine Typen, nur Text. DuckDB liest die ersten Zeilen und rät: ganze Zahlen werden BIGINT, Daten wie 2026-06-01 werden DATE, alles andere VARCHAR, also Text.
describe select * from read_csv(...) zeigt, was geraten wurde. Prüfen Sie das, bevor Sie rechnen.
Was DuckDB für unsere Datei rät
| Spalte | Beispielwert | Geratener Typ |
|---|---|---|
| id | 1 | BIGINT |
| tag | 2026-06-01 | DATE |
| kundin | Lena | VARCHAR |
| menge | 3 | BIGINT |
| preis_cent | 250 | BIGINT |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Probieren Sie es: ein Wert, der nicht passt
-- try_cast gibt NULL, wenn ein Wert nicht passt.
select try_cast('2026-06-01' as date) as gueltig,
try_cast('morgen' as date) as ungueltig;
-- Probieren Sie try_cast('12' as integer).
Dieselbe Abfrage läuft auf einer Tabelle
In den Blöcken dieser Seite gibt es keine hochgeladene Datei. Darum steht hier eine Tabelle bestellungen, die der Datei entspricht.
Die Abfrage ändert sich nur in einem Wort: from bestellungen statt from read_csv('bestellungen.csv'). Alles andere bleibt gleich.
Probieren Sie es: die Abfrage auf der Tabelle
-- Dieselbe Abfrage, auf der nachgebauten Tabelle.
select produkt, sum(menge) as stueck
from bestellungen
group by produkt
order by produkt;
-- Zählen Sie statt der Stücke die Bestellungen je Kundin.
Ein häufiger Fehler
Warnung
Viele glauben, der Dateiname in der Abfrage genüge. Die Datei muss in der Spielwiese erst hochgeladen sein, und sie darf höchstens 64 KB haben. Ohne Datei meldet DuckDB, dass es sie nicht findet.