MySQL JOINS Tutorial: BINNEN, BUITEN, LINKS, RECHTS, KRUIS
Wat zijn JOINS?
Joins helpen bij het ophalen van gegevens uit twee of meer databasetabellen.
De tabellen zijn onderling gerelateerd met behulp van primaire en externe sleutels.
Opmerking: JOIN is het meest onbegrepen onderwerp onder SQL-leerlingen. Omwille van de eenvoud en het gemak van begrip zullen we een nieuwe database gebruiken om het voorbeeld te oefenen. Zoals hieronder weergegeven
id | Voornaam | achternaam | film_id |
---|---|---|---|
1 | Adam | smid | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
5 | Luwte | Pong | 10 |
id | titel | categorie |
---|---|---|
1 | ASSASSIN'S CREED: EMBERS | Vermaak |
2 | Echt staal(2012) | Vermaak |
3 | Alvin and the Chipmunks | Vermaak |
4 | De Avonturen van Kuifje | Vermaak |
5 | Veilig (2012) | Actie |
6 | Veilig Huis (2012) | Actie |
7 | GIA | 18+ |
8 | Deadline 2009 | 18+ |
9 | Het vuile beeld | 18+ |
10 | Marley en ik | Romance |
Soorten joins
Kruis JOIN
Cross JOIN is een eenvoudigste vorm van JOIN's die elke rij van de ene databasetabel matcht met alle rijen van een andere.
Met andere woorden: het geeft ons combinaties van elke rij van de eerste tabel met alle records in de tweede tabel.
Stel dat we alle ledenrecords willen vergelijken met alle filmrecords, dan kunnen we het onderstaande script gebruiken om de gewenste resultaten te krijgen.
SELECT * FROM `movies` CROSS JOIN `members`
Voer het bovenstaande script uit in MySQL werkbank geeft ons de volgende resultaten.
id | title | id | first_name | last_name | movie_id | |
---|---|---|---|---|---|---|
1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
7 | GIA | 18+ | 1 | Adam | Smith | 1 |
7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
7 | GIA | 18+ | 6 | Lee | Pong | 10 |
8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
INNER JOIN
De inner JOIN wordt gebruikt om rijen uit beide tabellen terug te geven die aan de gegeven voorwaarde voldoen.
Stel dat u een lijst wilt krijgen van leden die films hebben gehuurd, samen met de titels van door hen gehuurde films. Je kunt daarvoor eenvoudigweg een INNER JOIN gebruiken, die rijen uit beide tabellen retourneert die aan bepaalde voorwaarden voldoen.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
Het uitvoeren van het bovenstaande script geeft
first_name | last_name | title |
---|---|---|
Adam | Smith | ASSASSIN'S CREED: EMBERS |
Ravi | Kumar | Real Steel(2012) |
Susan | Davidson | Safe (2012) |
Jenny | Adrianna | Deadline(2009) |
Lee | Pong | Marley and me |
Merk op dat het bovenstaande resultatenscript ook als volgt kan worden geschreven om dezelfde resultaten te bereiken.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members`AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
Buitenste JOIN's
MySQL Outer JOINs retourneren alle overeenkomende records uit beide tabellen.
Het kan records detecteren die geen match hebben in de samengevoegde tabel. Het keert terug NULL waarden voor records van samengevoegde tabellen als er geen overeenkomst wordt gevonden.
Klinkt verwarrend? Laten we een voorbeeld bekijken –
Links aansluiten
Stel nu dat je de titels van alle films wilt hebben, samen met de namen van leden die ze hebben gehuurd. Het is duidelijk dat sommige films door niemand worden verhuurd. Wij kunnen gewoon gebruiken Links aansluiten Voor het doel.
De LEFT JOIN retourneert alle rijen uit de tabel aan de linkerkant, zelfs als er geen overeenkomende rijen zijn gevonden in de tabel aan de rechterkant. Als er geen overeenkomsten zijn gevonden in de tabel aan de rechterkant, wordt NULL geretourneerd.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B ON B.`movie_id` = A.`id`
Voer het bovenstaande script uit in MySQL workbench geeft. Je kunt zien dat in het geretourneerde resultaat, dat hieronder wordt vermeld, dat voor films die niet zijn verhuurd, de velden voor de lidnaam NULL-waarden hebben. Dat betekent dat er geen overeenkomend lid een ledentabel voor die specifieke film heeft gevonden.
title | first_name | last_name |
---|---|---|
ASSASSIN'S CREED: EMBERS | Adam | Smith |
Real Steel(2012) | Ravi | Kumar |
Safe (2012) | Susan | Davidson |
Deadline(2009) | Jenny | Adrianna |
Marley and me | Lee | Pong |
Alvin and the Chipmunks | NULL | NULL |
The Adventures of Tin Tin | NULL | NULL |
Safe House(2012) | NULL | NULL |
GIA | NULL | NULL |
The Dirty Picture | NULL | NULL |
RECHTS AANMELDEN
RIGHT JOIN is duidelijk het tegenovergestelde van LEFT JOIN. De RIGHT JOIN retourneert alle kolommen uit de tabel aan de rechterkant, zelfs als er geen overeenkomende rijen zijn gevonden in de tabel aan de linkerkant. Als er geen overeenkomsten zijn gevonden in de tabel aan de linkerkant, wordt NULL geretourneerd.
Laten we in ons voorbeeld aannemen dat u de namen van leden en de door hen gehuurde films nodig heeft. Nu hebben we een nieuw lid dat nog geen film heeft gehuurd
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Voer het bovenstaande script uit in MySQL workbench geeft de volgende resultaten.
first_name | last_name | title |
---|---|---|
Adam | Smith | ASSASSIN'S CREED: EMBERS |
Ravi | Kumar | Real Steel(2012) |
Susan | Davidson | Safe (2012) |
Jenny | Adrianna | Deadline(2009) |
Lee | Pong | Marley and me |
NULL | NULL | Alvin and the Chipmunks |
NULL | NULL | The Adventures of Tin Tin |
NULL | NULL | Safe House(2012) |
NULL | NULL | GIA |
NULL | NULL | The Dirty Picture |
“ON”- en “USING”-clausules
In bovenstaande JOIN-queryvoorbeelden hebben we de ON-clausule gebruikt om de records tussen tabellen te matchen.
De USING-clausule kan ook voor hetzelfde doel worden gebruikt. Het verschil met GEBRUIK MAKEND VAN is het moet identieke namen hebben voor overeenkomende kolommen in beide tabellen.
In de tabel “films” hebben we tot nu toe de primaire sleutel met de naam “id” gebruikt. We verwezen ernaar in de tabel “leden” met de naam “movie_id”.
Laten we het veld “films”-tabellen hernoemen naar het “id”-veld, zodat het de naam “movie_id” krijgt. We doen dit om identieke overeenkomende veldnamen te hebben.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Laten we vervolgens USING gebruiken met het bovenstaande LEFT JOIN-voorbeeld.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B USING ( `movie_id` )
Afgezien van het gebruik van ON en GEBRUIKEN met JOIN's je kunt er nog veel meer gebruiken MySQL clausules zoals GROEP DOOR, WAAR en functioneert zelfs als SOM, AVG, Etc.
Waarom zouden we joins gebruiken?
Nu denk je misschien: waarom gebruiken we JOIN's als we dezelfde taak kunnen uitvoeren door query's uit te voeren. Vooral als je enige ervaring hebt met databaseprogrammering, weet je dat we query's één voor één kunnen uitvoeren en de uitvoer van elke query in opeenvolgende query's kunnen gebruiken. Natuurlijk is dat mogelijk. Maar met behulp van JOIN's kunt u het werk gedaan krijgen door slechts één query met zoekparameters te gebruiken. Aan de andere kant MySQL betere prestaties kunnen bereiken met JOINs omdat het indexering kan gebruiken. Door eenvoudigweg een enkele JOIN-query te gebruiken in plaats van meerdere query's uit te voeren, wordt de serveroverhead verminderd. Het gebruik van meerdere query's in plaats daarvan leidt tot meer gegevensoverdrachten tussen MySQL en applicaties (software). Verder vereist het ook meer gegevensmanipulaties aan het einde van de applicatie.
Het is duidelijk dat we beter kunnen bereiken MySQL en applicatieprestaties door gebruik van JOIN's.
Samenvatting
- Met JOINS kunnen we gegevens uit meer dan één tabel combineren in één resultatenset.
- JOINS presteren beter in vergelijking met subquery's
- INNER JOINS retourneert alleen rijen die aan de opgegeven criteria voldoen.
- OUTER JOINS kan ook rijen retourneren waarin geen overeenkomsten zijn gevonden. De niet-overeenkomende rijen worden geretourneerd met het trefwoord NULL.
- De belangrijkste JOIN-typen zijn Inner, Left Outer, Right Outer, Cross JOINS enz.
- De meest gebruikte clausule in JOIN-bewerkingen is “ON”. De clausule “USING” vereist dat overeenkomende kolommen dezelfde naam hebben.
- JOINS kunnen ook worden gebruikt in andere clausules zoals GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS etc.