Database queries

Gegevens filteren

Stel dat je niet alle records uit een tabel wil opvragen maar je wilt gegevens filteren.
In onderstaand voorbeeld worden alleen de kolommen doc_naam en telefoon weergegeven uit de tabel docent. Met where worden de gegevens gefilterd. De data uit de kolom doc_naam moet overeenkomen met de tekst 'Witlok'. Omdat het om tekst gaat, moet 'Witlok' tussen aanhalingstekens worden geplaatst.

 select doc_naam, telefoon from docent where doc_naam = 'Witlok';
+----------+------------+
| doc_naam | telefoon   |
+----------+------------+
| Witlok   | 071-123378 |
+----------+------------+

Filteren op plaatsnaam:

 select doc_naam, telefoon from docent where plaats = 'Oosterhout';
+----------+------------+
| doc_naam | telefoon   |
+----------+------------+
| Witlok   | 071-123378 |
| Peters   | 01620-3429 |
+----------+------------+

LIKE

Zowel Peters al Witlok wonen in Oosterhout!

Er kan ook gefilterd worden op een deel van de data. Stel dat alle namen en telefoonnumers van docenten uit plaatsen die beginnen met de letter 'B' moeten worden weergegeven. Dan kan dat door weer gebruik te maken van where en de operator like.

select doc_naam, plaats, telefoon from docent where plaats like 'B%';
+------------+--------+------------+
| doc_naam   | plaats | telefoon   |
+------------+--------+------------+
| Hooymayers | Breda  | 076-442786 |
| Sengers    | Bavel  | NULL       |
| Mol        | Breda  | 076-227788 |
+------------+--------+------------+

Met bovenstaande query worden de docenten uit 'Bavel' en 'Breda' weergegeven. Het '%'-tekentje in de query staat voor een 'wildcard'. Je kunt voor een %-teken iedere reeks van karakters in de plaats zetten. Zo moet een plaats in ieder geval beginnen met de letter 'B', maar maakt het niet uit welke karakters daar nog achteraan komen.

Filters combineren

Het is ook mogelijk om op meerdere criteria te filteren.

select doc_naam, plaats, telefoon from docent where plaats = 'Bavel' or plaats = 'Oosterhout';
+----------+------------+------------+
| doc_naam | plaats     | telefoon   |
+----------+------------+------------+
| Witlok   | Oosterhout | 071-123378 |
| Peters   | Oosterhout | 01620-3429 |
| Sengers  | Bavel      | NULL       |
+----------+------------+------------+

In where plaats = 'Bavel' or plaats = 'Oosterhout' uit bovenstaand voorbeeld worden alle docenten getoond die wonen in Bavel of Oosterhout. Beide plaatsen worden in het overzicht getoond.

Je kunt de criteria ook aanscherpen zodat data aan meerdere voorwaarden moet voldoen. Hieronder worden alle docenten getoond waarvan de naam eindigt op 'rs' en de plaats begint met een 'B'. Met where doc_naam like '%rs' and plaats like 'B%' gelden beide voorwaarden alleen voor Hooymayers en Sengers!

select doc_naam, plaats, telefoon from docent where doc_naam like '%rs' and plaats like 'B%';
+------------+--------+------------+
| doc_naam   | plaats | telefoon   |
+------------+--------+------------+
| Hooymayers | Breda  | 076-442786 |
| Sengers    | Bavel  | NULL       |
+------------+--------+------------+

IS NULL

Er kan ook gefilterd worden op velden die leeg zijn. Sommige docenten hebben geen telefoon. Om te bepalen wie dat zijn kan de volgende query worden gebruikt:

select doc_naam, telefoon from docent where telefoon is null;
+----------+----------+
| doc_naam | telefoon |
+----------+----------+
| Sengers  | NULL     |
+----------+----------+

Met is null vind je alle lege velden.

De omgekeerde select kan ook handig zijn. In onderstaand voorbeeld worden alle docenten met een telefoon weergegeven:

select doc_naam, telefoon from docent where not telefoon is null;
+------------+------------+
| doc_naam   | telefoon   |
+------------+------------+
| Witlok     | 071-123378 |
| Hooymayers | 076-442786 |
| Grond      | 013-426786 |
| Peters     | 01620-3429 |
| Mol        | 076-227788 |
+------------+------------+

Met not voor de veldnaam-operator-waarde (telefoon is null) wordt de omgekeerde selectie getoond.

Distinct

Als je een overzicht wilt opvragen van de verschillende woonplaatsen van de cursisten dan kun je de volgende query gebruiken:

select plaats from cursist;
+------------+
| plaats     |
+------------+
| Made       |
| Oosterhout |
| Goirle     |
| Breda      |
| Dronten    |
| Dronten    |
+------------+

Zoals je ziet krijg je ook dubbele waarden. Er zijn meerdere cursisten die uit Dronten komen. Je kunt alleen unieke waarden opvragen door de dubbele waarnden te filteren met distinct.

select distinct plaats from cursist;
+------------+
| plaats     |
+------------+
| Made       |
| Oosterhout |
| Goirle     |
| Breda      |
| Dronten    |
+------------+

Dronten komt nog maar 1 keer voor in de uitvoer.

Oefeningen