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.

Soorten joins

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.

INNER JOIN

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.

Buitenste JOIN's

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
Note: Null is returned for non-matching rows on right

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

RECHTS AANMELDEN

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
Note: Null is returned for non-matching rows on left

“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.