MySQL JOINS-zelfstudie: BINNEN, BUITEN, LINKS, RECHTS, CROSS

Anonim

Wat zijn JOINS?

Joins helpen bij het ophalen van gegevens uit twee of meer databasetabellen. De tabellen zijn onderling verbonden met behulp van primaire en externe sleutels.

Opmerking: JOIN is het meest verkeerd begrepen onderwerp onder SQL-leaners. Omwille van de eenvoud en het begrip, zullen we een nieuwe database gebruiken om voorbeelden te oefenen. Zoals hieronder getoond

ID kaart Voornaam achternaam movie_id
1 Adam Smith 1
2 Ravi Kumar 2
3 Susan Davidson 5
4 Jenny Adrianna 8
6 Lee Pong 10
ID kaart titel categorie
1 ASSASSIN'S CREED: EMBERS Animaties
2 Real Steel (2012) Animaties
3 Alvin en de eekhoorns Animaties
4 De Avonturen van Kuifje Animaties
5 Veilig (2012) Actie
6 Safe House (2012) Actie
7 GIA 18+
8 Termijn 2009 18+
9 Het vuile plaatje 18+
10 Marley en ik Romantiek

Soorten joins

Kruis JOIN

Cross JOIN is een eenvoudigste vorm van JOINs die elke rij van de ene databasetabel overeenkomt 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`

Het uitvoeren van het bovenstaande script in MySQL-workbench 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

BINNENKOM

De inner JOIN wordt gebruikt om rijen uit beide tabellen te retourneren die aan de gegeven voorwaarde voldoen.

Stel dat u een lijst wilt krijgen van leden die films hebben gehuurd, samen met titels van films die door hen zijn gehuurd. Je kunt daarvoor gewoon een INNER JOIN gebruiken, die rijen uit beide tabellen retourneert die voldoen aan de gegeven voorwaarden.

SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`

Het uitvoeren van het bovenstaande script geven

 
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 AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`

Outer JOINs

MySQL Outer JOINs retourneren alle records die overeenkomen met beide tabellen.

Het kan records detecteren die geen overeenkomst hebben in de samengevoegde tafel. Het retourneert NULL- waarden voor records van samengevoegde tabel als er geen overeenkomst wordt gevonden.

Klinkt verwarrend? Laten we naar een voorbeeld kijken -

LINKS WORDT LID

Stel nu dat u titels van alle films samen wilt krijgen met de namen van leden die ze hebben gehuurd. Het is duidelijk dat sommige films door niemand zijn gehuurd. We kunnen hiervoor gewoon LEFT JOIN gebruiken .

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 ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`

Het uitvoeren van het bovenstaande script in MySQL-werkbank geeft. U kunt zien dat in het geretourneerde resultaat dat hieronder wordt weergegeven dat voor films die niet worden verhuurd, de naamvelden van de leden NULL-waarden hebben. Dat betekent dat geen overeenkomend lid de 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 MEEDOEN

RIGHT JOIN is duidelijk het tegenovergestelde van LEFT JOIN. De RIGHT JOIN-functie 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 namen nodig heeft van leden en films die door hen zijn gehuurd. Nu hebben we een nieuw lid die nog geen film heeft gehuurd

SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`

Het uitvoeren van het bovenstaande script 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

"AAN" en "GEBRUIK" -clausules

In bovenstaande JOIN-queryvoorbeelden hebben we de ON-clausule gebruikt om de records tussen de tabellen te matchen.

De clausule USING kan ook voor hetzelfde doel worden gebruikt. Het verschil met USING is dat het identieke namen moet hebben voor overeenkomende kolommen in beide tabellen.

In de "films" -tabel hebben we tot dusver de primaire sleutel met de naam "id" gebruikt. We verwezen naar hetzelfde in de "leden" -tabel met de naam "film_id".

Laten we het veld "films" tabellen "id" hernoemen naar de naam "movie_id". 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 GEBRUIKEN gebruiken met het bovenstaande LEFT JOIN-voorbeeld.

SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )

Afgezien van het gebruik van ON en USING with JOINs , kunt u vele andere MySQL-clausules gebruiken, zoals GROUP BY, WHERE en zelfs functies zoals SUM , AVG , enz.

Waarom zouden we joins gebruiken?

Nu denk je misschien, waarom we JOINs gebruiken als we dezelfde taak kunnen uitvoeren door queries uit te voeren. Vooral als je enige ervaring hebt met databaseprogrammering, weet je dat we queries een voor een kunnen uitvoeren, en de output van elk in opeenvolgende queries kunnen gebruiken. Dat kan natuurlijk. Maar door JOINs te gebruiken, kunt u het werk gedaan krijgen door slechts één zoekopdracht met zoekparameters te gebruiken. Aan de andere kant kan MySQL betere prestaties behalen met JOINs omdat het Indexing kan gebruiken. Gewoon gebruik van een enkele JOIN-query in plaats van meerdere query's uit te voeren, vermindert de serveroverhead. Het gebruik van meerdere queries leidt tot meer gegevensoverdrachten tussen MySQL en applicaties (software). Verder vereist het ook meer datamanipulaties aan het einde van de applicatie.

Het is duidelijk dat we door het gebruik van JOINs betere MySQL- en applicatieprestaties kunnen behalen.

Overzicht

  • JOINS stelt ons in staat om gegevens uit meer dan één tabel te combineren tot één resultaatset.
  • JOINS hebben betere prestaties in vergelijking met subquery's
  • INNER JOINS retourneren alleen rijen die voldoen aan de opgegeven criteria.
  • OUTER JOINS kan ook rijen retourneren waarin geen overeenkomsten zijn gevonden. De niet-overeenkomende rijen worden geretourneerd met het NULL-sleutelwoord.
  • De belangrijkste JOIN-typen zijn Inner, Left Outer, Right Outer, Cross JOINS etc.
  • De vaak gebruikte clausule in JOIN-bewerkingen is "ON". De clausule "USING" vereist dat overeenkomende kolommen dezelfde naam hebben.
  • JOINS kan ook worden gebruikt in andere clausules zoals GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS etc.