SQL Beginnershandleiding

  1. Inleiding
  2. De eerste tabel
  3. De database benaderen vanuit PHP
  4. PDO: De database benaderen vanuit PHP
  5. Invoegen van records
  6. PDO: Invoegen van records
  7. Selecteren van records
  8. PDO: Selecteren van records
  9. Wijzigen van records
  10. PDO: Wijzigen van records
  11. Verwijderen van records
  12. PDO: Verwijderen van records
  13. Sleutels en constraints
  14. Selecteren uit meerdere tabellen: JOINS
  15. Werken met data en tijden
  16. Aggregate functies en GROUP BY
  17. Debuggen: het oplossen van SQL fouten
  18. Slotwoord en referenties
  19. Reacties op deze tutorial

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:
Code
1
2
3
4
5
SELECT
    kolomnaam,
    kolomnaam
FROM
    tabelnaam

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:
Code: query
1
2
3
4
SELECT
    voornaam
FROM
    werknemers
Code: output
1
2
3
4
5
6
7
+----------+
| voornaam |
+----------+
| Nico     |
| Tim      |
| Pim      |
+----------+

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
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
<?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 />';
    }
}
?>
Output
Nico
Tim
Pim

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: query
1
2
SELECT *
FROM werknemers
Code: output
1
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 |
+----+----------+---------------+------------+---------------+----------------+

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: query
1
2
3
4
5
6
7
SELECT
    voornaam,
    salaris_schaal
FROM
    werknemers
WHERE
    salaris_schaal = 10
Code: output
1
2
3
4
5
6
+----------+----------------+
| 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: query
1
2
3
4
5
6
SELECT
    *
FROM
    werknemers
WHERE
    salaris_schaal >= 12
Code: output
1
2
3
4
5
+----+----------+---------------+------------+---------------+----------------+
| 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:
Code: query
1
2
3
4
5
6
7
8
SELECT
    voornaam
FROM
    werknemers
WHERE
    salaris_schaal = 10
AND
    achternaam = 'Vosse'
Code: output
1
2
3
4
5
+----------+
| voornaam |
+----------+
| Pim      |
+----------+

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: query
1
2
3
4
5
6
7
8
9
SELECT
    voornaam,
    tussenvoegsel,
    achternaam,
    geboortedatum
FROM
    werknemers
ORDER BY
    voornaam ASC
Code: output
1
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    |
+----------+---------------+------------+---------------+

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:
Code
1
LIMIT van, aantal

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: query
1
2
3
4
5
SELECT
    *
FROM
    werknemers
LIMIT 1,2
Code: output
1
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 |
+----+----------+---------------+------------+---------------+----------------+

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:
Code
1
LIMIT 5

is hetzelfde als:
Code
1
LIMIT 0,5

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 Volgende