Wat is het verschil tussen “Innerlijke Join” en “Outer Join”?

Ook hoe doen LEFT JOIN, RIGHT JOINen FULL JOINpassen in?


1, Autoriteit 100%

Aangenomen dat u deelneemt aan kolommen zonder duplicaten, wat een zeer algemeen geval is:

  • Een innerlijke join van A en B geeft het resultaat van een kruiseling B, dwz het innerlijke deel van een Venn diagram kruising.

  • Een buitenste join van A en B geeft de resultaten van een Unie B, d.w.z. de buitenste delen van een Venn-diagram-Unie.

voorbeelden

Stel dat u twee tabellen hebt, met elk een enkele kolom, en gegevens als volgt:

A    B
-    -
1    3
2    4
3    5
4    6

Merk op dat (1,2) uniek zijn voor A, (3,4) zijn gebruikelijk, en (5,6) zijn uniek voor b.

Innerlijke join

Een innerlijke join met behulp van een van de equivalente query’s geeft de kruising van de twee tafels, d.w.z. de twee rijen die zij gemeen hebben.

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4

Links Outer Join

Een linker buitenste join geeft alle rijen in a, plus eventuele gemeenschappelijke rijen in b.

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);
a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

Rechts Buitenste Join

Een rechter buitenste join geeft alle rijen in b, plus eventuele gemeenschappelijke rijen in een.

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;
a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

Volledige outer join

Een volledige outer join geeft je de unie van A en B, dwz alle rijen in A en alle rijen in B. Als iets in A geen corresponderend gegeven in B heeft, dan is het B-gedeelte nul en vice versa.

select * from a FULL OUTER JOIN b on a.a = b.b;
 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

Antwoord 2, autoriteit 13%

De Venn-diagrammen doen het niet echt voor mij.

Ze laten bijvoorbeeld geen onderscheid zien tussen een cross-join en een inner-join, of, meer in het algemeen, een onderscheid tussen verschillende typen join-predikaten of bieden een kader om te redeneren over hoe ze zullen werken.

Er is geen vervanging voor het begrijpen van de logische verwerking en het is hoe dan ook relatief eenvoudig te begrijpen.

  1. Stel je een cross-join voor.
  2. Evalueer de ON-clausule ten opzichte van alle rijen uit stap 1 en zorg ervoor dat die waarbij het predikaat evalueert tot true
  3. (Alleen voor outer joins) voeg weer toe aan buitenste rijen die verloren zijn gegaan in stap 2.

(NB: in de praktijk kan de query-optimizer efficiëntere manieren vinden om de query uit te voeren dan de puur logische beschrijving hierboven, maar het uiteindelijke resultaat moet hetzelfde zijn)

Ik begin met een geanimeerde versie van een volledige outer join. Verdere uitleg volgt.


Uitleg

Brontabellen

Begin eerst met een CROSS JOIN(ook wel cartesiaans product genoemd). Dit heeft geen ON-clausule en retourneert eenvoudig elke combinatie van rijen uit de twee tabellen.

SELECTEER A.Kleur, B.Kleur UIT EEN CROSS JOIN B

Inner en Outer joins hebben een “ON” clausule predikaat.

  • Inner Join.Evalueer de voorwaarde in de “ON”-clausule voor alle rijen in het resultaat van de cross-join. Indien waar, retourneer de samengevoegde rij. Gooi het anders weg.
  • Left Outer Join.Hetzelfde als inner join, dan voor alle rijen in de linkertabel die nergens mee overeenkwamen, voer deze uit met NULL-waarden voor de rechtertabelkolommen.
  • Rechts buitenste join.Hetzelfde als inner join en dan voor alle rijen in de rechtertabel die nergens mee overeenkwamen, voer deze uit met NULL-waarden voor de linkertabelkolommen.
  • Volledige buitenste samenvoeging.Hetzelfde als de binnenste samenvoeging, bewaar de linker niet-overeenkomende rijen zoals in de linker buitenste samenvoeging en de rechter niet-overeenkomende rijen volgens de rechter buitenste samenvoeging.

Enkele voorbeelden

SELECTEER A.Kleur, B.Kleur UIT EEN BINNENKANT SLUIT B AAN OP A.Kleur = B.Kleur

Het bovenstaande is de klassieke equi-join.

Geanimeerde versie

SELECTEER A.Kleur, B.Kleur UIT EEN BINNENKANT VOEG B AAN AAN A.Kleur NIET IN (‘Groen’,’Blauw’)

De inner join-voorwaarde hoeft niet per se een gelijkheidsvoorwaarde te zijn en hoeft niet te verwijzen naar kolommen uit beide (of zelfs geen van beide) tabellen. Het evalueren van A.Colour NOT IN ('Green','Blue')op elke rij van de cross join retourneert.

SELECTEER A.Kleur, B.Kleur VANAF EEN BINNENSTAD JOIN B ON 1 =1

De join-voorwaarde is waar voor alle rijen in het resultaat van een cross-join, dus dit is hetzelfde als een cross-join. Ik zal de afbeelding van de 16 rijen niet nog een keer herhalen.

SELECTEER A.Kleur, B.Kleur VANAF EEN LINKER BUITENKANT SLUIT B AAN OP A.Kleur = B.Kleur

Outer Joins worden logisch geëvalueerd op dezelfde manier als inner joins, behalve dat als een rij uit de linkertabel (voor een linkerjoin) helemaal niet samenkomt met rijen uit de rechtertabel, deze in het resultaat behouden blijft met NULLwaarden voor de rechterkolommen.

SELECTEER A.Colour, B.Colour VANAF EEN LINKER BUITENKANT SLUIT B AAN OP A.Colour = B.Colour WAAR B.Colour NULL IS

Dit beperkt eenvoudig het vorige resultaat om alleen de rijen terug te geven waar B.Colour IS NULL. In dit specifieke geval zijn dit de rijen die bewaard zijn gebleven omdat ze geen overeenkomst hadden in de rechter tabel en de query retourneert de enkele rode rij die niet overeenkomt in tabel B. Dit staat bekend als een anti semi-join.

Het is belangrijk om een kolom te selecteren voor de IS NULL-test die niet nullable is of waarvoor de join-voorwaarde ervoor zorgt dat alle NULL-waarden op volgorde worden uitgesloten om dit patroon correct te laten werken en te voorkomen dat u alleen rijen terughaalt die toevallig een NULL-waarde voor die kolom hebben naast de niet-overeenkomende rijen.

SELECTEER A.Kleur, B.Kleur VANAF EEN RECHTS BUITENKANT SLUIT B AAN OP A.Kleur = B.Kleur

Rechter outer joins werken op dezelfde manier als linker outer joins, behalve dat ze niet-overeenkomende rijen uit de rechtertabel behouden en null de linkerkolom uitbreiden.

SELECTEER A.Kleur, B.Kleur UIT EEN VOLLEDIGE BUITENKANT SLUIT B AAN OP A.Kleur = B.Kleur

Volledige outer joins combineren het gedrag van linker- en rechterjoins en behouden de niet-overeenkomende rijen van zowel de linker- als de rechtertafel.

SELECTEER A.Kleur, B.Kleur VANUIT EEN VOLLEDIGE BUITENSTE JOIN B ON 1 = 0

Er zijn geen rijen in de cross-join die overeenkomen met het predikaat 1=0. Alle rijen van beide kanten worden bewaard met behulp van normale outer join-regels met NULL in de kolommen van de tabel aan de andere kant.

SELECTEER COALESCE(A.Kleur, B.Kleur) ALS Kleur VANUIT EEN VOLLEDIGE OUTER JOIN B ON 1 = 0

Met een kleine wijziging aan de voorgaande zoekopdracht zou men een UNION ALLvan de twee tabellen kunnen simuleren.

SELECTEER A.Kleur, B.Kleur VANAF EEN LINKER BUITENKANT SLUIT B AAN OP A.Kleur = B.Kleur WAAR B.Kleur = ‘Groen’

Houd er rekening mee dat de WHERE-clausule (indien aanwezig) logisch na de join wordt uitgevoerd. Een veelvoorkomende fout is om een left outer join uit te voeren en vervolgens een WHERE-component op te nemen met een voorwaarde in de rechtertabel die uiteindelijk de niet-overeenkomende rijen uitsluit. Het bovenstaande leidt uiteindelijk tot het uitvoeren van de outer join…

… En dan wordt de “Waar”-clausule uitgevoerd. NULL= 'Green'evalueert niet naar waar, dus de rij die door de buitenste join wordt bewaard, wordt weggegooid (samen met de blauwe) en converteert de join effectief terug naar een binnenste.

Als het de bedoeling was om alleen rijen van B op te nemen waar Kleur Groen is en alle rijen van A, ongeacht de juiste syntaxis

SELECTEER A.Kleur, B.Kleur VANAF EEN LINKER BUITENKANT SLUIT B AAN OP A.Kleur = B.Kleur EN B.Kleur = ‘Groen’

SQL Fiddle

Bekijk deze voorbeelden live uitgevoerd op SQLFiddle.com.


Antwoord 3, autoriteit 3%

Joinsworden gebruikt om de gegevens uit twee tabellen te combineren, met als resultaat een nieuwe, tijdelijke tabel. Joins worden uitgevoerd op basis van iets dat een predikaat wordt genoemd, dat de voorwaarde specificeert die moet worden gebruikt om een join uit te voeren. Het verschil tussen een inner join en een outer join is dat een inner join alleen de rijen retourneert die daadwerkelijk overeenkomen op basis van het join-predikaat.
Voor bijv. Laten we eens kijken naar de tabel Werknemer en Locatie:

Innerlijke deelname:-
Inner join maakt een nieuwe resultaattabel door kolomwaarden van twee tabellen (Werknemeren Locatie) te combineren op basis van het join-predicaat. De query vergelijkt elke rij van Employeemet elke rij van Locatieom alle paren rijen te vinden die voldoen aan het join-predicaat. Wanneer aan het join-predicaat wordt voldaan door niet-NULL-waarden te matchen, worden kolomwaarden voor elk overeenkomend paar rijen van Werknemeren Locatiegecombineerd tot een resultaatrij.
Zo ziet de SQL voor een inner join eruit:

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

Dit is hoe het resultaat van het uitvoeren van die SQL eruit zou zien:

Outer Join:-
Voor een outer join hoeft niet elk record in de twee samengevoegde tabellen een overeenkomend record te hebben. De samengevoegde tabel behoudt elke record, zelfs als er geen andere overeenkomende record bestaat. Outer joins worden verder onderverdeeld in linker outer joins en rechter outer joins, afhankelijk van de rijen van de tabel die behouden blijven (links of rechts).

Linker buitenste join:-
Het resultaat van een left outer join (of gewoon left join) voor tabellen Werknemeren Locatiebevat altijd alle records van de “linker” tabel (Werknemer), zelfs als de join-voorwaarde geen overeenkomend record vindt in de “rechter” tabel (Locatie).
Hier is hoe de SQL voor een left outer join eruit zou zien, met behulp van de bovenstaande tabellen:

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

Nu, hier is het resultaat van het uitvoeren van deze SQL eruit ziet:

Rechts Outer Join: –
Een rechter buitenste join (of rechts join) lijkt op een linker buitenste join, behalve met de behandeling van de tafels omgekeerd. Elke rij van de “Right” -tabel (Locatie ) verschijnt minstens één keer in de aangesloten tabel. Als er geen overeenkomende rij uit de tabel “Links” (-werknemer ) bestaat, verschijnt NULL in kolommen van Medewerker voor die records die geen overeenkomst hebben in Locatie .
Dit is hoe de SQL eruit ziet:

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

Met behulp van de bovenstaande tabellen kunnen we laten zien wat de resultaatreeks van een rechter uiterwaarden eruit ziet:

volledige buitenste joins: –
Volledige buitenste join of volledige join is om de niet-gearrificeerde informatie te behouden door niet -matige rijen in de resultaten van een deel te nemen, gebruik een volledige buitenste join. Het bevat alle rijen van beide tabellen, ongeacht of de andere tabel al dan niet een overeenkomende waarde heeft.

beeldbron

MySQL 8.0 Referentiemaneel – Join Syntax

Oracle Join-operations


4, Autoriteit 2%

Inner join

Alleen de overeenkomende rijen ophalen, dat wil zeggen, A intersect B.

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Linker buitenste join

Selecteer alle records uit de eerste tabel en alle records in de tweede
tabel die overeenkomen met de samengevoegde sleutels.

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Volledige externe deelname

Selecteer alle records uit de tweede tabel en alle records in de eerste
tabel die overeenkomen met de samengevoegde sleutels.

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Referenties


Antwoord 5, autoriteit 2%

In eenvoudige bewoordingen:

Een inner joinhaalt alleen de overeenkomende rijen op.

Terwijl een outer joinde overeenkomende rijen van de ene tabel en alle rijen in een andere tabel ophaalt ….het resultaat hangt af van welke je gebruikt:

  • Links: overeenkomende rijen in de rechtertabel en alle rijen in de linkertabel

  • Rechts: overeenkomende rijen in de linkertabel en alle rijen in de rechtertabel of

  • Vol: alle rijen in alle tabellen. Het maakt niet uit of er een match is of niet


Antwoord 6, autoriteit 2%

Een inner join toont alleen rijen als er een overeenkomende record is aan de andere (rechter) kant van de join.

Een (linker) outer join toont rijen voor elke record aan de linkerkant, zelfs als er geen overeenkomende rijen zijn aan de andere (rechter) kant van de join. Als er geen overeenkomende rij is, zouden de kolommen voor de andere (rechter) kant NULL tonen.


Antwoord 7

Inner joins vereisen dat er een record met een gerelateerde ID bestaat in de samengevoegde tabel.

Outer joins retourneren records voor de linkerkant, zelfs als er niets bestaat voor de rechterkant.

U hebt bijvoorbeeld een Orders en een OrderDetails-tabel. Ze zijn gerelateerd aan een “OrderID”.

Bestellingen

  • Bestel-ID
  • Klantnaam

Besteldetails

  • OrderDetailID
  • Bestel-ID
  • Productnaam
  • Aantal
  • Prijs

Het verzoek

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

retourneert alleen Bestellingen die ook iets in de OrderDetails-tabel hebben.

Als je het verandert in OUTER LEFT JOIN

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
  LEFT JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

dan retourneert het records uit de tabel Orders, zelfs als ze geen OrderDetails-records hebben.

U kunt dit gebruiken om bestellingen te vinden die geen OrderDetails hebben die een mogelijke verweesde bestelling aangeven door een waar-clausule toe te voegen, zoals WHERE OrderDetails.OrderID IS NULL.


Antwoord 8

In eenvoudige woorden:

Innerlijke verbinding-> Neem ALLEEN algemene records van bovenliggende en onderliggende tabellen WAAR de primaire sleutel van de bovenliggende tabel overeenkomt met de externe sleutel in de onderliggende tabel.

Linker join->

pseudocode

1.Take All records from left Table
2.for(each record in right table,) {
    if(Records from left & right table matching on primary & foreign key){
       use their values as it is as result of join at the right side for 2nd table.
    } else {
       put value NULL values in that particular record as result of join at the right side for 2nd table.
    }
  }

Right join: precies tegenovergesteld aan left join . Zet de naam van de tabel in LEFT JOIN aan de rechterkant in Right join, je krijgt dezelfde output als LEFT JOIN.

Outer join: Toon alle records in beide tabellen No matter what. Als records in de linkertabel niet overeenkomen met de rechtertabel op basis van Primary , Foreign key , gebruik dan de NULL-waarde als resultaat van join .

Voorbeeld:

Laten we nu aannemen voor 2 tafels

1.employees , 2.phone_numbers_employees

employees : id , name 
phone_numbers_employees : id , phone_num , emp_id   

Hier is de werknemerstabel de hoofdtabel, phone_numbers_employees is de onderliggende tabel (deze bevat emp_idals externe sleutel die employee.idverbindt met de onderliggende tabel.)

innerlijke voegsel

Neem de records van 2 tabellen alleen als primaire sleutel van werknemers tabel (zijn ID) overeenkomt met buitenlandse sleutel van kindertafeltelefoon_numbers_employees (emp_id) .

Dus query zou zijn:

SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Hier treft alleen overeenkomende rijen op de primaire sleutel = Buitenlandse sleutel zoals hierboven uitgelegd. Er zijn niet-overeenkomende rijen op primaire sleutel = Buitenlandse sleutel worden overgeslagen als gevolg van JOIN.

Left Sjo’s :

Links join behoudt alle rijen van de linker tafel, ongeacht of er een rij is die overeenkomt met de rechtertabel.

SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Outer Joins :

SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Diagramatisch lijkt het erop:


9

U gebruikt INNER JOINom alle rijen van beide tabellen te retourneren waar er een overeenkomst is. d.w.z. in de resulterende tabel Alle rijen en kolommen hebben waarden.

In OUTER JOINDe resulterende tabel kan lege kolommen hebben. Buitenste join is mogelijk LEFT JOINof RIGHT.

LEFT OUTER JOINRetourneert alle rijen van de eerste tabel, zelfs als er geen overeenkomsten zijn in de tweede tabel.

RIGHT OUTER JOINretourneert alle rijen van de tweede tabel, zelfs als er geen overeenkomsten zijn in de eerste tabel.


Antwoord 10

INNER JOINvereist dat er ten minste een overeenkomst is bij het vergelijken van de twee tabellen. Bijvoorbeeld tabel A en tabel B die A ٨ B impliceert (A snijpunt B).

LEFT OUTER JOINen LEFT JOINzijn hetzelfde. Het geeft alle records die overeenkomen in beide tabellen en alle mogelijkheden van de linkertabel.

Evenzo zijn RIGHT OUTER JOINen RIGHT JOINhetzelfde. Het geeft alle records die overeenkomen in beide tabellen en alle mogelijkheden van de juiste tabel.

FULL JOINis de combinatie van LEFT OUTER JOINen RIGHT OUTER JOINzonder duplicatie.


11

Innerlijke join.

Een join combineert de rijen van twee tafels. Een Inner join pogingen om de twee tabellen op te passen aan de criteria die u in de query opgeeft, en geeft alleen de rijen die overeenkomen. Als een rij uit de eerste tabel in de join twee rijen in de tweede tabel overeenkomt, worden twee rijen in de resultaten geretourneerd. Als er een rij is in de eerste tabel die niet overeenkomt met een rij in de tweede, wordt het niet geretourneerd; Evenzo, als er een rij is in de tweede tabel die niet overeenkomt met een rij in de eerste, wordt het niet geretourneerd.

Outer Join.

A LINKS WORDT Pogingen om de rijen van de eerste tabel in de tweede tabel in de tweede tabel te vinden. Als het een overeenkomst niet kan vinden, retourneert deze de kolommen van de eerste tabel en laat deze de kolommen van de tweede tabel leeg (NULL).


12

  • INNER JOINMeest typische join voor twee of meer tafels.
    Het retourneert gegevenswedstrijd op zowel de tabel op basis van de primaire en forignkey.
  • OUTER JOINis hetzelfde als INNER JOIN, maar het bevat ook NULLgegevens over het resultaat.
    • LEFT JOIN= INNER JOIN+ Unatched-gegevens van Left Tabel met NULLMatch op rechter tafel.
    • RIGHT JOIN= INNER JOIN+ Niet-overeenkomende gegevens van rechtertabel met NULLmatch op linkertabel.
    • FULL JOIN= INNER JOIN+ Ongeëvenaarde gegevens op zowel rechts als linkstabellen met NULLovereenkomsten.
  • Self join is geen sleutelwoord in SQL, wanneer een tabel naar gegevens op zichzelf verwijst, wordt dit self join genoemd. Met behulp van INNER JOINen OUTER JOINkunnen we self-join queries schrijven.

Bijvoorbeeld:

SELECT * 
FROM   tablea a 
       INNER JOIN tableb b 
               ON a.primary_key = b.foreign_key 
       INNER JOIN tablec c 
               ON b.primary_key = c.foreign_key 

Antwoord 13

Ik zie niet veel details over prestaties en optimalisatie in de andere antwoorden.

Soms is het goed om te weten dat alleen INNER JOINassociatief is, wat betekent dat de optimizer de meeste opties heeft om ermee te spelen. Het kan de volgorde van de samenvoeging opnieuw ordenen om het sneller te maken en hetzelfde resultaat te behouden. De optimizer kan de meeste join-modi gebruiken.

Over het algemeen is het een goede gewoonte om INNER JOINte gebruiken in plaats van de verschillende soorten joins. (Natuurlijk als het mogelijk is gezien de verwachte resultatenset.)

Er zijn hier een paar goede voorbeelden en uitleg over dit vreemde associatieve gedrag:


Antwoord 14

Na kritiek op het geliefde roodgekleurde Venn-diagram, vond ik het niet meer dan eerlijk om mijn eigen poging te posten.

Hoewel het antwoord van @martin Smith het beste van dit bos is, toont hij slechts de belangrijkste kolom van elke tabel, terwijl ik denk dat idealiter niet-belangrijke kolommen moeten worden getoond.

Het beste wat ik kon doen in het half uur toegestaan, ik denk het nog steeds niet voldoende, laat zien dat de nulls er zijn als gevolg van de afwezigheid van belangrijke waarden in TableBof die OUTER JOINis eigenlijk een unie in plaats van een join:


Antwoord 15

Eenvoudigste definities

Inner Join: Retourneert overeenkomende recordsuit beide tabellen.

Full Outer Join: retourneert overeenkomende en niet-overeenkomende recordsvan beide tabellen met null voor niet-overeenkomende records van Beide tabellen.

Left Outer Join: retourneert alleen overeenkomende en niet-overeenkomende records van tafel aan Linkerkant.

Right Outer Join: retourneert alleen overeenkomende en niet-overeenkomende records van tafel aan Rechts.

In het kort

Overeenkomend + links niet-overeenkomend + rechts niet-overeenkomend = Volledige buitenste join

Overeenkomend + Links niet-overeenkomend = Linker buitenste deelname

Overeenkomend + Rechts niet-overeenkomend = Rechts buitenste join

Gematched = Innerlijke deelname


Antwoord 16

In eenvoudige bewoordingen,

1.INNER JOIN OR EQUI JOIN :Retourneert de resultatenset die alleen overeenkomt met de voorwaarde in beide tabellen.

2.OUTER JOIN :Retourneert de resultatenset van alle waarden uit beide tabellen, zelfs als er wel of geen overeenkomst is met de voorwaarde.

3.LEFT JOIN :Retourneert de resultatenset van alle waarden uit de linkertabel en alleen rijen die overeenkomen met de voorwaarde in de rechtertabel.

4.RIGHT JOIN :Retourneert de resultatenset van alle waarden uit de rechtertabel en alleen rijen die overeenkomen met de voorwaarde in de linkertabel.

5.FULL JOIN :Full Join en Full outer Join zijn hetzelfde.


17

1.Inner Join:Ook wel Join genoemd. Het geeft alleen de rijen terug die aanwezig zijn in zowel de linkertabel als de rechtertabel als er een overeenkomst is. Anders levert het nul records op.

Voorbeeld:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
INNER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

2.Full Outer Join:Ook wel Full Join genoemd. Het geeft alle rijenterug die aanwezig zijn in zowel de linkertabel als de rechtertabel.

Voorbeeld:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
FULL OUTER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

3.Left Outer join:Of gewoon genoemd als Left Join. Het geeft alle rijen terug die aanwezig zijn in de linkertabel en overeenkomende rijen uit de rechtertabel (indien aanwezig).

4.Right Outer Join:Ook wel Right Join genoemd. Het retourneert overeenkomende rijen uit de linkertabel (indien aanwezig) en alle rijen die aanwezig zijn in de rechtertabel.

Voordelen van joins

  1. Wordt sneller uitgevoerd.

Antwoord 18

Joins zijn gemakkelijker uit te leggen met een voorbeeld:

Om personen en e-mails in afzonderlijke tabellen te simuleren,

Tabel A en Tabel B zijn verbonden door Table_A. ID = tabel_b. NAM_ID

Innerlijke join

Alleen afgestemde IDS-rijen worden getoond.

Outer Joins

Past ID’s en niet afgestemde rijen voor tafel A worden getoond.

overeenkomende ID’s en niet gematchte rijen voor tabel B worden getoond.


Gepaste ID’s en niet gematchte rijen van beide tabellen worden getoond.

OPMERKING: Volledige buitenste join is niet beschikbaar op MySQL


Antwoord 19

Het verschil tussen INNER JOINen OUTER JOINis als volgt:

  1. INNER JOINis een join die tabellen combineert op basis van overeenkomende tupels, terwijl OUTER JOINeen join is die tabellen combineert op basis van zowel overeenkomende als niet-overeenkomende tupels.
  2. INNER JOINvoegt overeenkomende rijen uit twee tabellen samen waar niet-overeenkomende rijen worden weggelaten, terwijl OUTER JOINrijen uit twee tabellen samenvoegt en niet-overeenkomende rijen vullen met een null-waarde.
  3. INNER JOINis als een kruisingsoperatie, terwijl OUTER JOINals een vakbondsoperatie is.
  4. INNER JOINzijn twee typen, terwijl OUTER JOINdrie typen zijn.
  5. OUTER JOINis sneller dan INNER JOIN.

Antwoord 20

Er zijn hier veel goede antwoorden met zeer nauwkeurige relationele algebravoorbeelden. Hier is een zeer vereenvoudigd antwoord dat nuttig kan zijn voor amateur- of beginnende programmeurs met SQL-coderingsdilemma’s.

Kortom, vaker wel dan niet, komen JOIN-query’s neer op twee gevallen:

Voor een SELECTvan een subset van Agegevens:

  • gebruik INNER JOINwanneer de gerelateerde B-gegevens die u zoekt MOETbestaan per databaseontwerp;
  • gebruik LEFT JOINwanneer de gerelateerde B-gegevens die u zoekt, MOCHTof MOGELIJK NIETper database bestaan ontwerp.

Antwoord 21

Een demonstratie

Instellen

Ga naar psqlen maak een kleine database van katten en mensen.
Je kunt deze hele sectie gewoon kopiëren en plakken.

CREATE DATABASE catdb;
\c catdb;
\pset null '[NULL]' -- how to display null values
CREATE TABLE humans (
  name text primary key
);
CREATE TABLE cats (
  human_name text references humans(name),
  name text
);
INSERT INTO humans (name)
VALUES ('Abe'), ('Ann'), ('Ben'), ('Jen');
INSERT INTO cats (human_name, name)
VALUES
('Abe', 'Axel'),
(NULL, 'Bitty'),
('Jen', 'Jellybean'),
('Jen', 'Juniper');

Bevragen

Dit is een zoekopdracht die we meerdere keren zullen uitvoeren, waarbij we [SOMETHING JOIN]wijzigen in de verschillende typen om de resultaten te zien.

SELECT
humans.name AS human_name,
cats.name AS cat_name
FROM humans
[SOMETHING JOIN] cats ON humans.name = cats.human_name
ORDER BY humans.name;

Een INNER JOINretourneert alle mens-kat-paren.
Elke mens zonder kat of kat zonder mens is uitgesloten.

human_name | cat_name
------------+-----------
 Abe        | Axel
 Jen        | Jellybean
 Jen        | Juniper

Een FULL OUTER JOINretourneert alle mensen en alle katten, met NULLals er geen overeenkomst is aan beide kanten.

human_name | cat_name
------------+-----------
 Abe        | Axel
 Ann        | [NULL]
 Ben        | [NULL]
 Jen        | Jellybean
 Jen        | Juniper
 [NULL]     | Bitty

Een LEFT OUTER JOINretourneert alle mensen (de linkertabel).
Ieder mens zonder kat krijgt een NULLin de kolom cat_name.
Elke kat zonder mens is uitgesloten.

human_name | cat_name
------------+-----------
 Abe        | Axel
 Ann        | [NULL]
 Ben        | [NULL]
 Jen        | Jellybean
 Jen        | Juniper

Een RIGHT OUTER JOINretourneert alle katten (de rechtertabel).
Elke kat zonder mens krijgt een NULLin de kolom human_name.
Elke mens zonder kat is uitgesloten.

human_name | cat_name
------------+-----------
 Abe        | Axel
 Jen        | Jellybean
 Jen        | Juniper
 [NULL]     | Bitty

BINNEN vs BUITEN

Je kunt zien dat terwijl een INNER JOINalleen overeenkomende paren krijgt, elk soort OUTERjoin een aantal items bevat zonder een overeenkomst.

De eigenlijke woorden INNERen OUTERhoeven echter niet in zoekopdrachten te verschijnen:

  • JOINop zich impliceert INNER
  • LEFT JOIN, RIGHT JOINen OUTER JOINimpliceren allemaal OUTER

Other episodes