Learnit Training

SQL - 5 tips voor het filteren met WHERE

Bij het selecteren van gegevens uit een database moet je vaak een filter samenstellen. Hier 5 tips om veel voorkomende fouten te voorkomen bij het filteren met WHERE.

Alle voorbeelden kun je ook hier zelf uit proberen op sqlfiddle.com met de Uitslagen database.

Tip 1

Als je filtert op tekst moet deze tussen enkele quotes worden geplaatst. Maar het kan natuurlijk voorkomen dat de gezochte tekst zelf een quote bevat. Deze kun je 'escapen' door twee in plaats van één quotes te typen. De quote die wordt geëscaped wordt dan niet langer als afsluiting gezien, maar als onderdeel van de tekst. De query om alle studenten uit 's-Gravenhage te zoeken ziet er als volgt uit:

SELECT  *
FROM    Uitslagen
WHERE   plaats = '''s-Gravenhage';

Tip 2

Het blijft onhandig dat niet overal ter wereld de komma als decimaal teken wordt gebruikt. Dit levert voor ons Nederlanders nog al eens verwarring op. In de ANSI standaard van SQL is gekozen voor de Amerikaanse getalnotatie. In queries moeten decimalen dus ALTIJD genoteerd worden met een punt.

SELECT  *
FROM    Uitslagen
WHERE   resultaat >= 8.5

Laat je niet verwarren als je in het resultaat een komma ziet, de komma heeft in een query een heel andere betekenis.

Tip 3

Het is mogelijk om meerdere filtervoorwaarden te combineren, bijvoorbeeld door zowel een AND als een OR te gebruiken:

SELECT  *
FROM    Uitslagen
WHERE   plaats = 'Amsterdam' OR plaats = '''s-Gravenhage' 
        AND resultaat >= 8.5

Er zit hier een addertje onder het gras: voorwaarden worden niet van links naar rechts gecombineerd. De AND operator bindt sterker dan de OR. Onze voorbeeld query resulteert in:

  • alle studenten uit Amsterdam
  • alle studenten uit 's-Gravenhage met resultaat van minimaal 8,5.

Dat was echter niet wat we voor ogen hadden, we wilden alleen de studenten uit 's-Gravenhage en Amsterdam zien die minimaal een 8,5 scoren. We zien nu ook studenten uit Amsterdam die minder dan een 8,5 scoren. Gelukkig is dit eenvoudig op te lossen door gebruik te maken van haakjes:

SELECT  *
FROM    Uitslagen
WHERE   (plaats = 'Amsterdam' OR plaats = '''s-Gravenhage') 
        AND resultaat >= 8.5

Tip 4

Het tonen van alle studenten met een cijfer in de range 8,5 t/m 9 kan met de volgende query:

SELECT  *
FROM    Uitslagen
WHERE   resultaat >= 8.5 AND resultaat <=9

Voor het selecteren van een range is echter ook een apart keyword beschikbaar. Het keyword BETWEEN maakt de query iets korter. Deze kan op volgende manier worden gebruikt:

SELECT  *
FROM    Uitslagen
WHERE   resultaat BETWEEN 8.5 AND 9

Maar let op, het keyword BETWEEN kan het nogal eens verwarring opleveren; bij ons Nederlanders wordt BETWEEN vaak vertaald met 'tussen'. Echter ook de cijfers met grenswaarden, in ons voorbeeld 8,5 en 9, worden getoond in het resultaat. Een betere vertaling van BETWEEN is 'van ... tot en met'.

Tip 5

Om queries compacter te schrijven kun je soms gebruik maken van het IN keyword. Bijvoorbeeld om alle studenten uit Amsterdam, Rotterdam en 's-Gravenhage te tonen:

SELECT  *
FROM    Uitslagen
WHERE   plaats = 'Amsterdam' OR 
        plaats = 'Rotterdam' OR 
        plaats =  '''s-Gravenhage'

Dat kan ook zo:

SELECT  *
FROM    Uitslagen
WHERE   plaats IN ('Amsterdam', 'Rotterdam',  '''s-Gravenhage')

De laatste notatie is niet alleen veel korter, maar ook veel makkelijker uit te breiden.