Inner en outer join
De in de voorbeelden gebruikte tabellen
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
27
28
29
30
31
32
33
34
35
36
37
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 |
+ --------------- + --------------- + ------------- + --------------- +
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 |
+ --------------- + -------------- + --------------- + ------------- + --------------- +
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 | | | |
+ --------------- + -------------- + --------------- + ------------- + --------------- +
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 |
+ --------------- + -------------- + --------------- + ------------- + --------------- +
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)
1
2
3
4
5
6
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)
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)
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
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 |
+ --------------- + -------------- + --------------- + ------------- + --------------- +
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 |
+ --------------- + -------------- + --------------- + ------------- + --------------- +
« vorige pagina | volgende pagina »
Inhoudsopgave
- Inleiding
- Joins algemeen
- Inner en outer join
- Cross en natural join
- Joins in de praktijk (1)
- Subqueries
- Joins in de praktijk (2)
- Group by
- Group by voorbeelden
- Conditional staments
- Nog meer voorbeelden
- Nawoord