Selecteren van records
Nu we gegevens naar onze database hebben weggeschreven, willen we ze natuurlijk op weer uit de database op kunnen halen. Dit kunnen we doen met behulp van een SELECT query.
Syntax
De syntax van de simpelste SELECT query ziet er als volgt uit:
Deze syntax vormt de basis van elke SELECT query. Hoewel we later zullen zien dat hier vele uitbreidingen en varianten op mogelijk zijn, zullen we eerst deze basis maar eens gebruiken om wat gegevens te selecteren.
Namen selecteren (SQL)
Stel nu dat we de voornamen van onze werknemers uit de tabel willen selecteren. Dan zouden we daar de volgende query voor gebruiken:
Zoals we zien levert deze query netjes een lijstje met alle voornamen in onze tabel op.
Namen selecteren (PHP)
Ook in PHP kunnen we dezelfde query namen gaan selecteren. Alleen zullen we dan nog wel een manier moeten vinden om de namen op het scherm te zetten. Dat doen we als volgt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
require_once 'db_config.php';
$sql = "
SELECT
voornaam
FROM
werknemers
";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_num_rows($res) == 0)
{
echo 'Geen resultaten gevonden';
}
else
{
while($row = mysql_fetch_assoc($res))
{
echo $row['voornaam'].'<br />';
}
}
?>
require_once 'db_config.php';
$sql = "
SELECT
voornaam
FROM
werknemers
";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_num_rows($res) == 0)
{
echo 'Geen resultaten gevonden';
}
else
{
while($row = mysql_fetch_assoc($res))
{
echo $row['voornaam'].'<br />';
}
}
?>
Tot aan regel 14 komt de code bekend voor, daarna zien we echter iets nieuws. In een elseif statement controleren we met mysql_num_rows() of de resultaat-set in $res wel rijen bevat. Dit geeft ons namelijk een indicatie of er wel gegevens uit de database opgehaald zijn.
Als dat aantal niet gelijk is aan 0 gebruiken we mysql_fetch_assoc() om de rijen uit de resultaat set te halen. We zetten deze functie in een while-loop omdat we verwachten dat de resultaat-set meerdere rijen bevat. Op die manier doorlopen we alle rijen en hebben met $row telkens de beschikking over 1 rij.
De functie mysql_fetch_assoc() zorgt ervoor dat er een associatieve array gemaakt wordt van een rij uit de resultaat-set. De sleutels in die array zijn dan de kolomnamen en de waarden de bij de kolommen horende waarden. Aangezien wij de voornaam ophaalden, kunnen we deze dus uitlezen met $row['voornaam'].
Alle records selecteren
Als we alle gegevens uit een bepaalde tabel willen selecteren, kunnen we de volgende query gebruiken:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+----+----------+---------------+------------+---------------+----------------+
| id | voornaam | tussenvoegsel | achternaam | geboortedatum | salaris_schaal |
+----+----------+---------------+------------+---------------+----------------+
| 1 | Nico | de | Boer | 1958-03-24 | 18 |
| 2 | Tim | | Janssen | 1982-01-30 | 10 |
| 3 | Pim | | Vosse | 1982-01-30 | 10 |
+----+----------+---------------+------------+---------------+----------------+
| id | voornaam | tussenvoegsel | achternaam | geboortedatum | salaris_schaal |
+----+----------+---------------+------------+---------------+----------------+
| 1 | Nico | de | Boer | 1958-03-24 | 18 |
| 2 | Tim | | Janssen | 1982-01-30 | 10 |
| 3 | Pim | | Vosse | 1982-01-30 | 10 |
+----+----------+---------------+------------+---------------+----------------+
Het * staat hierbij voor alle kolommen en dient alleen gebruikt te worden als ook daadwerlijk alle kolommen nodig zijn. Als dat niet het geval is, geef je gewoon netjes de kolomnamen op.
WHERE
In de meeste gevallen zullen we niet alle records willen selecteren, maar enkel de records die aan een bepaalde voorwaarde voldoen. Zo'n voorwaarde kunnen we opgeven in de WHERE clausule van een query.
Stel dat we alleen de voornaam van de werknemer op willen halen die in salaris schaal 10 zitten. De volgende query zouden we dan gebruiken:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
+----------+----------------+
| voornaam | salaris_schaal |
+----------+----------------+
| Tim | 10 |
| Pim | 10 |
+----------+----------------+
| voornaam | salaris_schaal |
+----------+----------------+
| Tim | 10 |
| Pim | 10 |
+----------+----------------+
Net als in PHP kunnen we ook de groter dan en kleiner dan operators gebruiken. Stel dat we alle gegevens willen selecteren van werkenmers die in salaris schaal 12 of hoger zitten:
Code (php)
1
2
3
4
5
2
3
4
5
+----+----------+---------------+------------+---------------+----------------+
| id | voornaam | tussenvoegsel | achternaam | geboortedatum | salaris_schaal |
+----+----------+---------------+------------+---------------+----------------+
| 1 | Nico | de | Boer | 1958-03-24 | 18 |
+----+----------+---------------+------------+---------------+----------------+
| id | voornaam | tussenvoegsel | achternaam | geboortedatum | salaris_schaal |
+----+----------+---------------+------------+---------------+----------------+
| 1 | Nico | de | Boer | 1958-03-24 | 18 |
+----+----------+---------------+------------+---------------+----------------+
Het * is hier wederom geoorloofd omdat we werkelijk alle kolommen wilden selecteren.
WHERE ... AND ... OR
Als we records op willen halen die aan meedere voorwaarden voldoen, gebruiken we daarvoor bijvoorbeeld de volgende query:
In theorie zouden we onbeperkt veel keer AND aan de query toe kunnen voegen. Of dat nuttig is en of bovendien je datamodel dan nog juist is, is een tweede.
De tegenhanger van AND is OR. Dat kunnen we gebruiken als we records op willen halen die aan minimaal één van de gestelde voorwaarden voldoen. Het gebruik en de positie in de query is precies hetzelfde als bij AND. In een query is elke willekeurge combinatie van WHERE, AND en OR mogelijk, zolang de WHERE maar in de query voorkomt.
ORDER BY
De volgorde waarop records in een database staan heeft geen enkele waarde. Het sorteren van records zullen we dan dus ook bij het selecteren ervan moeten doen. Met behulp van ORDER BY is dat mogelijk:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
voornaam,
tussenvoegsel,
achternaam,
geboortedatum
FROM
werknemers
ORDER BY
voornaam ASC
voornaam,
tussenvoegsel,
achternaam,
geboortedatum
FROM
werknemers
ORDER BY
voornaam ASC
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+----------+---------------+------------+---------------+
| voornaam | tussenvoegsel | achternaam | geboortedatum |
+----------+---------------+------------+---------------+
| Nico | de | Boer | 1958-03-24 |
| Pim | | Vosse | 1982-01-30 |
| Tim | | Janssen | 1982-01-30 |
+----------+---------------+------------+---------------+
| voornaam | tussenvoegsel | achternaam | geboortedatum |
+----------+---------------+------------+---------------+
| Nico | de | Boer | 1958-03-24 |
| Pim | | Vosse | 1982-01-30 |
| Tim | | Janssen | 1982-01-30 |
+----------+---------------+------------+---------------+
In de ORDER BY geven we één of meer kolommen (gescheiden door een komma) op waarop we willen sorteren. Met behulp van ASC of DESC achter de kolomnaam geven we de sorteerrichting aan. ASC sorteert oplopend terwijl DESC aflopend sorteert.
Als je zowel een WHERE als een ORDER BY clausule in je query hebt, komt de ORDER BY altijd na de WHERE.
LIMIT
Met behulp van LIMIT is het mogelijk om het aantal records dat uit de database gehaald wordt te beperken. De syntax van de LIMIT is als volgt:
Op de plaats van van vul je het record in waar de limit moet beginnen. Het eerste record in een set heeft, net als in PHP arrays, de waarde 0. Vervolgens geef je met aantal aan hoeveel records er opgehaald moeten worden.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
+----+----------+---------------+------------+---------------+----------------+
| id | voornaam | tussenvoegsel | achternaam | geboortedatum | salaris_schaal |
+----+----------+---------------+------------+---------------+----------------+
| 2 | Tim | | Janssen | 1982-01-30 | 10 |
| 3 | Pim | | Vosse | 1982-01-30 | 10 |
+----+----------+---------------+------------+---------------+----------------+
| id | voornaam | tussenvoegsel | achternaam | geboortedatum | salaris_schaal |
+----+----------+---------------+------------+---------------+----------------+
| 2 | Tim | | Janssen | 1982-01-30 | 10 |
| 3 | Pim | | Vosse | 1982-01-30 | 10 |
+----+----------+---------------+------------+---------------+----------------+
De eerste parameter van de LIMIT is optioneel, dus die kun je ook weglaten. In dat geval wordt het aangegeven aantal records vanaf het begin opgehaald. Dus:
is hetzelfde als:
De plaats van de LIMIT in de query is, ongeacht welke clausules er nog meer in zitten, altijd aan het einde van de query.
« vorige pagina | volgende pagina »
Inhoudsopgave
- Inleiding
- De eerste tabel
- De database benaderen vanuit PHP
- Invoegen van records
- Selecteren van records
- Wijzigen van records
- Verwijderen van records
- Sleutels en constraints
- Selecteren uit meerdere tabellen: JOINS
- Werken met data en tijden
- Aggregate functies en GROUP BY
- Debuggen: het oplossen van SQL fouten
- Slotwoord en referenties