Spring til indhold
Academi.dk

SQL

WHERE - filtrér rækker

Begynder DA↔EN-ordliste

WHERE bestemmer, hvilke rækker der kommer med i resultatet. Du skriver en betingelse, og kun rækker, hvor den er sand, tages med. Betingelser kan kombineres med AND og OR, og NULL kræver sin egen særlige behandling.

Forudsætter, at du har set select - hent data .

Formen

SELECT navn, pris
FROM produkt
WHERE pris > 100;

Betingelsen vurderes for hver eneste række. Er den sand, kommer rækken med.

Operatorerne er dem, du kender. Med én undtagelse: i SQL betyder ét lighedstegn sammenligning, ikke tildeling. Og “forskellig fra” skrives <> (eller != i de fleste databaser).

WHERE status = 'aktiv'
WHERE status <> 'lukket'
WHERE pris >= 100 AND pris <= 500

Tekst skrives i enkelte anførselstegn i SQL. Dobbelte betyder noget andet.

Kombinér med AND og OR

SELECT navn
FROM produkt
WHERE (kategori = 'kaffe' OR kategori = 'te')
  AND pris < 200;

Sæt parenteser om dine OR-grupper. AND binder stærkere end OR, så uden parenteser betyder ovenstående noget helt andet, og det er en fejl, der giver et resultat, som ser plausibelt ud. Det er den slags, der koster point uden at ligne en fejl.

De praktiske genveje

WHERE kategori IN ('kaffe', 'te', 'kakao')
WHERE pris BETWEEN 100 AND 500
WHERE navn LIKE 'Ka%'
WHERE navn LIKE '%kop%'
  • IN er kortere end en lang OR-kæde.
  • BETWEEN er inklusiv i begge ender.
  • LIKE søger i tekst: % er nul eller flere vilkårlige tegn, _ er præcis ét.
SELECT navn FROM kunde WHERE email IS NULL;

Samme problem rammer negationer: WHERE status <> 'lukket' udelader også rækker, hvor status er NULL. Skal de med, skal du skrive det:

WHERE status <> 'lukket' OR status IS NULL;

WHERE eller HAVING?

WHERE filtrerer rækker, før de grupperes. HAVING filtrerer grupper, efter. Skal du filtrere på en sum eller et antal, skal du bruge HAVING. Se GROUP BY.

Undgå SQL-injektion

Byg aldrig en forespørgsel ved at klistre brugerens tekst ind i strengen. Skriver nogen ' OR 1=1 -- i et søgefelt, får de hele tabellen ud. Brug pladsholdere og lad databasedriveren indsætte værdien:

SELECT * FROM kunde WHERE email = ?

Det er også et spørgsmål, der falder ved den mundtlige eksamen, hvis I har et søgefelt i projektet.

Kort opsamling

  • WHERE filtrerer rækker; ét lighedstegn sammenligner.
  • Parenteser om OR-grupper.
  • IN, BETWEEN og LIKE sparer skrivearbejde.
  • NULL kræver IS NULL, aldrig = NULL.

Læs videre

Senest gennemgået .