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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+----+----------------+
| id | functie        |
+----+----------------+
|  1 | Manager        |
|  2 | Werknemer      |
|  3 | Senior Manager |
+----+----------------+
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 />';
        }
    }
}

?>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
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.

« Lees de omschrijving en reacties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.