Eine Abfrage mit SELECT kann dieselbe Zeile mehrfach liefern – etwa wenn eine Tabelle mehrere Einträge pro Kunde enthält und nur die Status-Spalte ausgegeben wird. SELECT DISTINCT entfernt solche doppelten Zeilen aus dem Ergebnis.

So funktioniert DISTINCT

SELECT DISTINCT status FROM bestellungen;

Die Datenbank betrachtet dabei das gesamte Tupel, also alle ausgewählten Spalten zusammen. Zwei Zeilen gelten nur dann als Duplikat, wenn sie in jeder Ausgabespalte übereinstimmen. DISTINCT steht direkt hinter SELECT und gilt nie für eine einzelne Spalte allein.

Häufige Muster

  • COUNT(DISTINCT kunden_id) zählt die eindeutigen Kunden in einer Tabelle – auch ohne GROUP BY.
  • Bei NULL gelten alle fehlenden Werte als gleich: Im Ergebnis erscheint höchstens eine Zeile mit NULL. COUNT(DISTINCT spalte) ignoriert NULL dagegen komplett.
  • PostgreSQL bietet zusätzlich SELECT DISTINCT ON (abteilung) name ... – es behält je Gruppe die erste Zeile, nützlich für „einen Datensatz pro Kunde“.

DISTINCT und GROUP BY

Beide können ähnlich wirken, sind aber nicht identisch: DISTINCT entfernt nur Duplikate, GROUP BY gruppiert zusätzlich und erlaubt Aggregatfunktionen. Wer nur eindeutige Werte sehen will, nutzt DISTINCT.

Performance

DISTINCT muss das Ergebnis sortieren oder hashen, um Duplikate zu erkennen – bei großen Ergebnismengen kann das teuer werden. Besser: nur die Spalten auswählen, die wirklich benötigt werden, oder Duplikate bereits an der Quelle vermeiden. Mehr dazu im Ausführungsplan.

Verwandte Grundlagen: SQL-Grundlagen, SQL WHERE, SQL NULL, SQL LIKE, SQL UNION ALL.