Inner en outer join

De in de voorbeelden gebruikte tabellen

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
CREATE TABLE bedrijven (
    bedrijf_id INT(11) NOT NULL AUTO_INCREMENT,
    bedrijf_naam VARCHAR(50),
    PRIMARY KEY (bedrijf_id));
    
INSERT INTO bedrijven (bedr_naam)
VALUES ('List en Bedrog'), ('Models'), ('PHP Hulp'), ('CompuInc');

CREATE TABLE contacten (
    contact_id INT(11) NOT NULL AUTO_INCREMENT,
        bedrijf_id INT(11),
        voornaam VARCHAR(50),
    achternaam VARCHAR(50),
        PRIMARY KEY (contact_id),
        INDEX (bedrijf_id));

INSERT INTO contacten (bedrijf_id, voornaam, achternaam)
VALUES (1, 'John', 'Doe'), (2, 'Naomi', 'Campbell'), (NULL, 'Roger', 'Rabbit'), (2, 'Claudia', 'Shiffer'), (NULL, 'Albert', 'Einstein';

+ --------------- + -------------- +
| bedrijf_id      | bedr_naam      |
+ --------------- + -------------- +
| 1               | List en Bedrog |
| 2               | Models         |
| 3               | PHP Hulp       |
| 4               | CompuInc       |
+ --------------- + -------------- +

+ --------------- + --------------- + ------------- + --------------- +
| contact_id      | bedrijf_id      | voornaam      | achternaam      |
+ --------------- + --------------- + ------------- + --------------- +
| 1               | 3               | John          | Doe             |
| 2               | 2               | Naomi         | Campbell        |
| 3               |                 | Roger         | Rabbit          |
| 4               | 2               | Claudia       | Shiffer         |
| 5               |                 | Albert        | Einstein        |
+ --------------- + --------------- + ------------- + --------------- +


Inner join
Met een inner join komen alleen die records in het resultaat die aan de join voorwaarden voldoen.
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
SELECT
    b.bedrijf_id, b.bedr_naam, c.contact_id, c.voornaam, c.achternaam
FROM
    bedrijven AS b
INNER JOIN
    contacten AS c ON c.bedrijf_id = b.bedrijf_id;

+ --------------- + -------------- + --------------- + ------------- + --------------- +
| bedrijf_id      | bedr_naam      | contact_id      | voornaam      | achternaam      |
+ --------------- + -------------- + --------------- + ------------- + --------------- +
| 2               | Models         | 2               | Naomi         | Campbell        |
| 2               | Models         | 4               | Claudia       | Shiffer         |
| 3               | PHP Hulp       | 1               | John          | Doe             |
+ --------------- + -------------- + --------------- + ------------- + --------------- +

Je ziet dat in bovenstaand resultaat bedrijf 1 en 4 ontbreken
In dit voorbeeld worden alleen de bedrijven geselecteerd waarvan het id ook in contactpersonen voorkomt.

Left join

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
SELECT
        b.bedrijf_id, b.bedr_naam, c.contact_id, c.voornaam, c.achternaam
FROM
    bedrijven AS b
LEFT JOIN    
    contacten AS c USING (bedrijf_id);
->
+ --------------- + -------------- + --------------- + ------------- + --------------- +
| bedrijf_id      | bedr_naam      | contact_id      | voornaam      | achternaam      |
+ --------------- + -------------- + --------------- + ------------- + --------------- +
| 1               | List en Bedrog |                 |               |                 |
| 2               | Models         | 2               | Naomi         | Campbell        |
| 2               | Models         | 4               | Claudia       | Shiffer         |
| 3               | PHP Hulp       | 1               | John          | Doe             |
| 4               | CompuInc       |                 |               |                 |
+ --------------- + -------------- + --------------- + ------------- + --------------- +

We hebben nu in het resultaat ook de bedrijven waarvan het id niet in contactpersonen voorkomt, alleen hebben de kolommen uit contactpersonen dan geen waarde (NULL)

Right join
De right join werkt precies omgekeerd tov van een left join:
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
SELECT
        b.bedrijf_id, b.bedr_naam, c.contact_id, c.voornaam, c.achternaam
FROM
    bedrijven AS b
RIGHT JOIN    
    contacten AS c USING (bedrijf_id)
->


+ --------------- + -------------- + --------------- + ------------- + --------------- +
| bedrijf_id      | bedr_naam      | contact_id      | voornaam      | achternaam      |
+ --------------- + -------------- + --------------- + ------------- + --------------- +
| 3               | PHP Hulp       | 1               | John          | Doe             |
| 2               | Models         | 2               | Naomi         | Campbell        |
|                 |                | 3               | Roger         | Rabbit          |
| 2               | Models         | 4               | Claudia       | Shiffer         |
|                 |                | 5               | Albert        | Einstein        |
+ --------------- + -------------- + --------------- + ------------- + --------------- +

We hebben nu alle contactpersonen personen in het resultaat. maar niet alle bedrijven.

FULL JOIN
Een FULL JOIN is combinatie van een LEFT JOIN en een RIGHT JOIN, je gebruikt dit als je alle records uit de linkertabel(len) ne rechtertabel bij elkaar wilt hebben.

SQL Server, PostgreSQL, DB2, Oracle etc:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT
        b.bedrijf_id, b.bedr_naam, c.contact_id, c.voornaam, c.achternaam
FROM
    bedrijven AS b
FULL JOIN    
    contacten AS c USING (bedrijf_id)

Zoals eerder gezegd kent MySQL geen FULL JOIN, maar we kunnen dat simuleren door zelf die combinatie te maken:
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
SELECT
        b.bedrijf_id, b.bedr_naam, c.contact_id, c.voornaam, c.achternaam
FROM
    bedrijven AS b
LEFT JOIN    
    contacten AS c USING (bedrijf_id)
UNION
SELECT
        b.bedrijf_id, b.bedr_naam, c.contact_id, c.voornaam, c.achternaam
FROM
    bedrijven AS b
RIGHT JOIN    
    contacten AS c USING (bedrijf_id)


ORDER BY
        bedr_naam, achternaam
->
+ --------------- + -------------- + --------------- + ------------- + --------------- +
| bedrijf_id      | bedr_naam      | contact_id      | voornaam      | achternaam      |
+ --------------- + -------------- + --------------- + ------------- + --------------- +
|                 |                | 5               | Albert        | Einstein        |
|                 |                | 3               | Roger         | Rabbit          |
| 4               | CompuInc       |                 |               |                 |
| 1               | List en Bedrog |                 |               |                 |
| 2               | Models         | 2               | Naomi         | Campbell        |
| 2               | Models         | 4               | Claudia       | Shiffer         |
| 3               | PHP Hulp       | 1               | John          | Doe             |
+ --------------- + -------------- + --------------- + ------------- + --------------- +

« Lees de omschrijving en reacties

Inhoudsopgave

  1. Inleiding
  2. Joins algemeen
  3. Inner en outer join
  4. Cross en natural join
  5. Joins in de praktijk (1)
  6. Subqueries
  7. Joins in de praktijk (2)
  8. Group by
  9. Group by voorbeelden
  10. Conditional staments
  11. Nog meer voorbeelden
  12. Nawoord

PHP tutorial opties

 
 

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.