Zum Inhalt springen
SQL Anfänger 25 min

WHERE - Daten filtern

Lerne, wie du mit WHERE gezielt Daten filterst: Vergleichsoperatoren, AND/OR, BETWEEN, IN, LIKE und mehr.

Aktualisiert:

Bisher hast du immer alle Datensaetze einer Tabelle abgefragt. In der Praxis willst du aber meistens nur bestimmte Daten sehen - zum Beispiel nur Kunden aus Berlin oder nur Produkte unter 50 Euro. Dafuer gibt es WHERE.

Die WHERE-Klausel

WHERE filtert die Ergebnisse nach einer Bedingung:

SELECT spalten
FROM tabelle
WHERE bedingung;

Einfache Vergleiche

-- Alle Kunden aus Berlin
SELECT * FROM kunden
WHERE stadt = 'Berlin';

-- Alle Produkte unter 50 Euro
SELECT name, preis FROM produkte
WHERE preis < 50;

-- Bestellungen mit dem Status 'offen'
SELECT * FROM bestellungen
WHERE status = 'offen';

Vergleichsoperatoren

SQL bietet verschiedene Operatoren zum Vergleichen:

OperatorBedeutungBeispiel
=gleichstadt = 'Berlin'
!= oder <>ungleichstatus != 'offen'
<kleiner alspreis < 50
>groesser alspreis > 100
<=kleiner oder gleichpreis <= 49.99
>=groesser oder gleichlagerbestand >= 50
-- Produkte, die nicht in der Kategorie 'Kleidung' sind
SELECT name, preis, kategorie
FROM produkte
WHERE kategorie != 'Kleidung';

-- Bestellungen mit Betrag ueber 100 Euro
SELECT id, kunden_id, betrag
FROM bestellungen
WHERE betrag > 100;

AND und OR - Mehrere Bedingungen

AND - Beide Bedingungen muessen erfuellt sein

-- Kleidung unter 50 Euro
SELECT name, preis, kategorie
FROM produkte
WHERE kategorie = 'Kleidung' AND preis < 50;

Ergebnis:

name          | preis | kategorie
--------------+-------+----------
T-Shirt Basic | 19.99 | Kleidung
Jeans Classic | 49.99 | Kleidung

OR - Mindestens eine Bedingung muss erfuellt sein

-- Kunden aus Berlin ODER Hamburg
SELECT name, stadt
FROM kunden
WHERE stadt = 'Berlin' OR stadt = 'Hamburg';

Ergebnis:

name          | stadt
--------------+--------
Anna Schmidt  | Berlin
Max Mueller   | Hamburg
Tom Becker    | Berlin

AND und OR kombinieren

Achtung: AND hat Vorrang vor OR! Nutze Klammern fuer Klarheit:

-- Falsch (ohne Klammern - unklare Logik):
SELECT * FROM produkte
WHERE kategorie = 'Kleidung' OR kategorie = 'Schuhe' AND preis < 50;

-- Richtig (mit Klammern):
SELECT * FROM produkte
WHERE (kategorie = 'Kleidung' OR kategorie = 'Schuhe') AND preis < 50;

Die erste Abfrage bedeutet: “Kleidung ODER (Schuhe unter 50 Euro)”. Die zweite bedeutet: “(Kleidung oder Schuhe) UND unter 50 Euro”.

NOT - Bedingung umkehren

-- Alle Produkte, die NICHT in der Kategorie 'Kleidung' sind
SELECT name, kategorie
FROM produkte
WHERE NOT kategorie = 'Kleidung';

-- Alle Kunden, die NICHT aus Berlin kommen
SELECT name, stadt
FROM kunden
WHERE NOT stadt = 'Berlin';

BETWEEN - Bereich

BETWEEN prueft, ob ein Wert in einem Bereich liegt (inklusive der Grenzen):

-- Produkte zwischen 20 und 80 Euro
SELECT name, preis
FROM produkte
WHERE preis BETWEEN 20 AND 80;

Ergebnis:

name           | preis
---------------+------
Jeans Classic  | 49.99
Sneaker Sport  | 79.99
Rucksack Urban | 39.99
-- Bestellungen im Februar 2026
SELECT id, bestelldatum, betrag
FROM bestellungen
WHERE bestelldatum BETWEEN '2026-02-01' AND '2026-02-28';

BETWEEN ist gleichbedeutend mit:

-- Diese beiden Abfragen sind identisch:
WHERE preis BETWEEN 20 AND 80
WHERE preis >= 20 AND preis <= 80

IN - Liste von Werten

IN prueft, ob ein Wert in einer Liste vorkommt:

-- Kunden aus Berlin, Hamburg oder Koeln
SELECT name, stadt
FROM kunden
WHERE stadt IN ('Berlin', 'Hamburg', 'Koeln');

Das ist viel kuerzer als:

-- Ohne IN (umstaendlich):
SELECT name, stadt
FROM kunden
WHERE stadt = 'Berlin' OR stadt = 'Hamburg' OR stadt = 'Koeln';
-- Bestellungen mit bestimmten Status-Werten
SELECT id, status, betrag
FROM bestellungen
WHERE status IN ('offen', 'versendet');

-- NOT IN - Werte ausschliessen
SELECT name, kategorie
FROM produkte
WHERE kategorie NOT IN ('Kleidung');

LIKE - Mustersuche in Texten

LIKE ermoeglicht die Suche mit Platzhaltern:

PlatzhalterBedeutungBeispiel
%Beliebig viele Zeichen'%shirt%' findet “T-Shirt Basic”
_Genau ein Zeichen'_ax' findet “Max”
-- Kunden, deren Name mit 'A' beginnt
SELECT name FROM kunden
WHERE name LIKE 'A%';

-- Produkte, die 'Shirt' im Namen haben
SELECT name FROM produkte
WHERE name LIKE '%Shirt%';

-- E-Mail-Adressen mit bestimmter Domain
SELECT name, email FROM kunden
WHERE email LIKE '%@example.com';

Gross-/Kleinschreibung bei LIKE

In PostgreSQL ist LIKE case-sensitive (beachtet Gross-/Kleinschreibung). Nutze ILIKE fuer case-insensitive Suche:

-- PostgreSQL: Case-insensitive Suche
SELECT name FROM produkte
WHERE name ILIKE '%shirt%';

-- SQLite: LIKE ist standardmaessig case-insensitive fuer ASCII
SELECT name FROM produkte
WHERE name LIKE '%shirt%';

IS NULL / IS NOT NULL

Wie bereits erwaehnt, sind NULL-Werte speziell:

-- Kunden ohne E-Mail
SELECT name FROM kunden
WHERE email IS NULL;

-- Kunden mit E-Mail
SELECT name, email FROM kunden
WHERE email IS NOT NULL;

-- WICHTIG: Das funktioniert NICHT mit = oder !=
-- WHERE email = NULL     -- FALSCH!
-- WHERE email != NULL    -- FALSCH!

Praxisbeispiele

Produktsuche mit mehreren Filtern

-- Guenstige Kleidung mit guter Verfuegbarkeit
SELECT name, preis, lagerbestand
FROM produkte
WHERE kategorie = 'Kleidung'
    AND preis < 60
    AND lagerbestand > 30;

Bestelluebersicht mit Bedingungen

-- Alle abgeschlossenen Bestellungen ueber 50 Euro
SELECT
    id,
    bestelldatum,
    betrag,
    status
FROM bestellungen
WHERE status = 'abgeschlossen'
    AND betrag > 50;

Kundensuche

-- Kunden aus Grossstaedten, deren Name mit 'M' oder 'S' beginnt
SELECT name, stadt, email
FROM kunden
WHERE stadt IN ('Berlin', 'Hamburg', 'Muenchen')
    AND (name LIKE 'M%' OR name LIKE 'S%');

Haeufige Fehler mit WHERE

-- Fehler 1: Strings ohne Anfuehrungszeichen
SELECT * FROM kunden WHERE stadt = Berlin;      -- FALSCH
SELECT * FROM kunden WHERE stadt = 'Berlin';     -- RICHTIG

-- Fehler 2: NULL-Vergleich mit =
SELECT * FROM kunden WHERE email = NULL;         -- FALSCH
SELECT * FROM kunden WHERE email IS NULL;        -- RICHTIG

-- Fehler 3: LIKE ohne Platzhalter (funktioniert wie =)
SELECT * FROM kunden WHERE name LIKE 'Anna';     -- findet nur exakt 'Anna'
SELECT * FROM kunden WHERE name LIKE '%Anna%';   -- findet alles mit 'Anna'

Was kommt als Naechstes?

Im naechsten Tutorial lernst du ORDER BY kennen, um deine Ergebnisse zu sortieren. Zusammen mit WHERE kannst du dann gezielt filtern UND sortieren.

Zusammenfassung

  • WHERE filtert Ergebnisse nach Bedingungen
  • Vergleichsoperatoren: =, !=, <, >, <=, >=
  • AND verknuepft Bedingungen (beide muessen wahr sein)
  • OR bietet Alternativen (mindestens eine muss wahr sein)
  • BETWEEN prueft einen Wertebereich
  • IN prueft gegen eine Liste von Werten
  • LIKE sucht mit Platzhaltern (% und _) in Texten
  • IS NULL / IS NOT NULL prueft auf fehlende Werte
  • Nutze Klammern, wenn du AND und OR kombinierst

Uebungen

  1. Filter: Finde alle Produkte der Kategorie ‘Accessoires’.
  2. BETWEEN: Zeige alle Bestellungen mit einem Betrag zwischen 50 und 150 Euro.
  3. LIKE: Finde alle Kunden, deren E-Mail-Adresse mit ‘a’ beginnt.
  4. Kombination: Zeige alle Produkte, die entweder unter 20 Euro kosten ODER einen Lagerbestand von ueber 50 haben UND in der Kategorie ‘Kleidung’ sind.
  5. IN: Finde alle Bestellungen, die NICHT den Status ‘abgeschlossen’ haben.
-- Loesung zu Uebung 1:
SELECT * FROM produkte WHERE kategorie = 'Accessoires';

-- Loesung zu Uebung 5:
SELECT * FROM bestellungen WHERE status NOT IN ('abgeschlossen');

Pro-Tipp: Baue deine WHERE-Bedingungen schrittweise auf. Starte mit einer einfachen Bedingung, pruefe das Ergebnis, und fuege dann weitere Bedingungen mit AND/OR hinzu. So findest du Fehler schneller und verstehst genau, was jede Bedingung bewirkt.

Zurück zum SQL Kurs