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 uit meerdere tabellen: JOINS

Naarmate de hoeveelheid gegevens die we opslaan in de database groeit, zal bij het normaliseren van ons datamodel naar voren komen dat we meerdere tabellen nodig hebben. Nu kan zal het vaak genoeg voorkomen dat we met één query gegevens uit meerdere tabellen willen selecteren.

Gelukkig hebben we op een nette manier de onderlinge relaties tussen deze tabellen aangebracht en biedt SQL ons een oplossing om uit meerdere tabellen tegelijk te selecteren. Met zogenaamde JOINS wordt aan de hand van een foreign key een verband gelegd met een andere tabel en is het mogelijk om data te selecteren.

Brongegevens
Voordat we verder kunnen kijken we eerst even naar hoe onze tabellen gevuld zijn:
Code: functies
1
2
3
4
5
6
7
+----+----------------+
| id | functie        |
+----+----------------+
|  1 | Manager        |
|  2 | Werknemer      |
|  3 | Senior Manager |
+----+----------------+
Code: werknemers
1
2
3
4
5
6
7
8
9
10
+----+----------+---------------+------------+---------------+----------------+------------+
| id | voornaam | tussenvoegsel | achternaam | geboortedatum | salaris_schaal | functie_id |
+----+----------+---------------+------------+---------------+----------------+------------+
|  1 | Nico     | de            | Boer       | 1958-03-24    |             18 |          1 |
|  2 | Tim      | NULL          | Janssen    | 1982-01-30    |             10 |          2 |
|  3 | Pim      | NULL          | Vosse      | 1980-12-20    |             10 |          2 |
|  4 | Joost    | de            | Hoog       | 1974-10-20    |             20 |          3 |
|  5 | Thomas   | NULL          | Verhoeven  | 1970-06-12    |             15 |          2 |
|  6 | Niels    | de            | Boer       | 1979-08-18    |             10 |          1 |
+----+----------+---------------+------------+---------------+----------------+------------+

We zien in totaal 3 verschillende functies in de functies tabel. Verder zien we dat er een aantal werknemers bijgekomen zijn en dat deze allemaal een functie hebben gekregen.

Naam en functie ophalen (SQL)
Stel nu dat we de namen van onze werknemers op willen halen met daarbij hun functie. We willen dus de kolommen voornaam, tussenvoegsel en achternaam uit de werknemers tabel en de kolom functie uit de functies tabel.
Code: query
1
2
3
4
5
6
7
8
9
10
SELECT
    w.voornaam,
    w.tussenvoegsel,
    w.achternaam,
    f.functie
FROM
    werknemers AS w
INNER JOIN
    functies AS f
        ON f.id = w.functie_id
Code: output
1
2
3
4
5
6
7
8
9
10
+----------+---------------+------------+----------------+
| voornaam | tussenvoegsel | achternaam | functie        |
+----------+---------------+------------+----------------+
| Nico     | de            | Boer       | Manager        |
| Niels    | de            | Boer       | Manager        |
| Tim      | NULL          | Janssen    | Werknemer      |
| Pim      | NULL          | Vosse      | Werknemer      |
| Thomas   | NULL          | Verhoeven  | Werknemer      |
| Joost    | de            | Hoog       | Senior Manager |
+----------+---------------+------------+----------------+

De output laat zien dat deze query inderdaad doet wat we willen, maar laten we nu eens kijken naar wat er precies gebeurt is.

Allereerst zien we dat de kolomnamen in de SELECT een letter ervoor hebben gekregen. Dit is een zogenaamde alias waarmee we de kolommen uit verschillende tabellen kunnen ophalen. De alias maken we aan in het FROM gedeelte van de query. Zouden we geen alias gebruiken, dan zou er in plaats van w.voornaam, werknemers.voornaam moeten staan. Maar ik ben lui, dus houd het liever zo kort mogelijk.

In de FROM clausule zien we de tabelnaam gevolgd door AS. Dit is de manier waarop we een alias voor een tabel aan kunnen maken. Nu kunnen we dus gewoon w gebruiken en hoeven we niet elke keer werknemers helemaal uit te schrijven.

Het type JOIN dat ik in dit voorbeeld gebruik is een zogenaamde INNER JOIN. In dit geval joinen we de functies tabel waarbij de kolommen functies.id overeen moet komen met de kolom werknemers.functie_id. Een INNER JOIN haalt alleen records op waarbij een match tussen deze twee kolommen is gevonden.

Naam en functie ophalen (PHP)
De PHP code waarin we deze query gebruiken ziet er als volgt uit:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
require_once 'db_config.php';

$sql "
    SELECT
        w.voornaam,
        w.tussenvoegsel,
        w.achternaam,
        f.functie
    FROM
        werknemers AS w
    INNER JOIN
        functies AS f
            ON f.id = w.functie_id
"
;

if(!
$res mysql_query($sql))
{
    
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(
mysql_num_rows($res) == 0)
{
    echo 
'Geen records gevonden.';
}
else
{
    while(
$row mysql_fetch_assoc($res))
    {
        if(empty(
$row['tussenvoegsel']))
        {
            echo 
$row['voornaam'].' '.$row['achternaam'].' ('.$row['functie'].') <br />';
        }
        else
        {
            echo 
$row['voornaam'].' '.$row['tussenvoegsel'].' '.$row['achternaam'].' ('.$row['functie'].') <br />';
        }
    }
}
?>
Output
Nico de Boer (Manager)
Niels de Boer (Manager)
Tim Janssen (Werknemer)
Pim Vosse (Werknemer)
Thomas Verhoeven (Werknemer)
Joost de Hoog (Senior Manager)

We zien wederom dat er aan de basis syntax van de PHP code heel weinig verandert. Enkel de afhandeling van de resultaten uit de query zal er telkens iets anders uit zien.

Andere typen JOINS
Naast de INNER JOIN zijn er nog een aantal verschillende soorten JOINS. Deze horen echter niet tot het onderwerp van deze tutorial, dus ik zal er hier ook verder niet op in gaan.

Meer informatie over het gebruik van JOINS kun je vinden in deze tutorial geschreven door Robert Deiman. Ook deze FAQ van tweakers.net geeft meer informatie over dit onderwerp.

Vorige Volgende