In dit artikel leren we de basisprincipes van het samenvoegen van tabellen in SQL. We leren over links, rechts, binnen en buiten JOIN's en geven voorbeelden van hoe ze te gebruiken.
Gegevens in een RDBMS (Relationeel Database Management Systeem) zijn gegroepeerd in tabellen. Deze tabellen hebben een strikte definitie van het type gegevens dat erin kan worden opgeslagen. Om verschillende tabellen, en dus verschillende soorten gegevens die met elkaar verband kunnen houden, met elkaar te verbinden, gebruiken we de JOIN-clausule.
Soorten JOIN's
Er zijn vier basistypen JOIN's:BINNEN, BUITEN, LINKS en RECHTS. Bij het verbinden van twee tabellen zullen ze elk een andere subset van de corresponderende tabellen retourneren op basis van de voorwaarde in de ON-clausule.
- LEFT en RIGHT JOINs voeren een vergelijkbare taak uit. Ze retourneren allebei het geheel van een enkele tabel met informatie die gerelateerd is aan de tweede tabel.
- INNER en OUTER JOIN's voeren zeer verschillende taken uit. INNER JOINs levert een zeer beperkt resultaat op, terwijl OUTER een complete dataset retourneert.
In dit voorbeeld gebruiken we het voorbeeld van een verkoopafdeling voor deze zelfstudie, met drie tabellen:verkopers, bestellingen en klanten.
De tabel met verkopers heeft drie kolommen:id, naam en commissietarief.
Vervolgens bevat de besteltabel vier kolommen:de bestel-ID, de totale kosten van de bestelling, de klant en, indien beschikbaar, de verkoper.
De klantentabel zal twee kolommen bevatten:id en basiscontactinformatie.
We hebben nu dus meerdere tabellen met informatie die op verschillende manieren nuttig zijn voor verschillende mensen. Aan de hand van deze drie tabellen (verkopers, bestellingen en klant) zullen we voorbeelden geven van hoe elk van de JOIN's nuttig kan zijn.
LEFT JOIN
Waarschijnlijk het meest gebruikte type JOIN is een LEFT JOIN. Als je denkt aan de twee tabellen die worden samengevoegd, de tafel die wordt genoemd in de FROM-clausule staat aan de linkerkant. Degene die wordt genoemd in de JOIN-clausule staat aan de rechterkant. In een LEFT JOIN wordt elke rij uit de LEFT (of FROM)-tabel geretourneerd in het resultaat en gekoppeld aan de bijbehorende rijen uit de RIGHT (of JOIN)-tabel die overeenkomen met de ON-clausule.
Houd er rekening mee dat sommige rijen aan de LINKERKANT mogelijk geen overeenkomende gegevens aan de RECHTS hebben. In dat geval worden de velden die zouden zijn ingevuld vanuit de RIGHT-tabel in het resultaat, gevuld met een NULL-waarde.
Als meerdere rijen in de RECHTER-tabel overeenkomen met de rijen in de LINKER-tabel, worden er ook meerdere rijen opgenomen in de resultatenset. Een Venn-diagram laat zien hoe een LEFT JOIN er gevisualiseerd uit zou zien:
De Marketing Director vraagt u om een rapport van alle bestellingen uitgesplitst naar klant. U kunt hiervoor een LEFT JOIN gebruiken:
SELECT *
FROM orders
LEFT JOIN customer
ON orders.customer_id = customer.id;
Deze query vraagt om alle gegevens in de "bestellingen"-tabel die is gekoppeld aan de rijen in de "klant"-tabel, waar de id van de klant gelijk is aan de klant_id in volgorde. Het resultaat ziet er als volgt uit:
Merk op dat er voor de Widgets LLC-klant drie inzendingen zijn omdat ze drie bestellingen hadden. Jolly Inc. heeft twee bestellingen geplaatst en Acme Inc. heeft er één geplaatst. Cheapo komt niet voor op deze lijst omdat er geen bestellingen zijn geplaatst.
RECHTS AANMELDEN
De RIGHT JOIN lijkt erg op de LEFT JOIN, behalve dat deze elke rij uit de RIGHT (JOIN)-tabel retourneert en alleen overeenkomstige rijen uit de LEFT (FROM)-tabel. Nogmaals, als er geen gegevens in de LEFT-tabel staan, worden die kolommen gevuld met NULL-waarden.
Als er meerdere rijen in de LINKER-tabel zijn, zullen er meerdere rijen in de resultatenset zijn. Het Venn-diagram ziet er als volgt uit:
Als het management een rapport wil met ELKE klant; zelfs als ze geen bestelling hebben geplaatst, kunnen we een RIGHT JOIN gebruiken.
SELECT *
FROM orders
RIGHT JOIN customer
ON orders.customer_id = customer.id;
We beginnen opnieuw met de "bestellingen" tafel en voegen deze toe aan de klantentafel. Omdat we een RIGHT JOIN hebben gebruikt, krijgen we ten minste één rij voor elk item in de RIGHT (JOIN)-tabel, klant. Als er een overeenkomst is tussen customer.id en orders.customer_id, wordt de informatie ingevuld. De resultaten bevatten Cheapo Co met NULL-waarden in de orderkolommen:
INNER JOIN
Een INNER JOIN retourneert alleen de rijen van elke kolom die overeenkomen met de ON-component. Als er geen match is aan RECHTS, worden de rijen van LINKS uitgesloten en vice versa. Het Venn-diagram voor een INNER JOIN ziet er als volgt uit:
Het is betaaldag en de salarisadministratie moet weten hoeveel commissie moet worden uitbetaald. Hiervoor moeten ze de bestellingen kennen die via elke verkoper zijn geplaatst. Houd er rekening mee dat niet alle bestellingen via een verkoper zijn verlopen, dus daar trekken we ons niets van aan. Hiervoor kunnen we een INNER JOIN gebruiken:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
INNER JOIN salespeople
ON orders.salesperson_id = salespeople.id;
We beginnen weer met de besteltabel. Deze keer doen we mee met de verkoperstafel. Als er een item in de ordertabel is dat overeenkomt met een item in de verkoperstabel, wordt de rij opgenomen. In plaats van niet-overeenkomende rijen te vullen met NULL-waarden, worden die rijen genegeerd in de resultaten.
Houd er rekening mee dat we de database vertellen niet alleen het verkoopbedrag en het commissiepercentage terug te geven, maar ook de berekende commissie. De resultaten zien er als volgt uit:
OUTER JOIN
Een OUTER JOIN retourneert alles, ongeacht of er een match is. Als je de resultaten van een LEFT en RIGHT JOIN zou combineren, zou je een OUTER JOIN krijgen. Het Venn-diagram voor een OUTER JOIN ziet er als volgt uit:
Het is nu het einde van de maand en de verkoopmanager wil ALLE verkopen weten, evenals alle uitbetaalde commissies. Hiervoor gebruiken we een OUTER JOIN:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
FULL OUTER JOIN salespeople
ON orders.salesperson_id = salespeople.id;
Net als het salarisrapport beginnen we met bestellingen en JOIN aan verkopers. Het verschil is dat je met een OUTER JOIN resultaten krijgt van zowel de LINKER- als de RECHTS-tafels waarin NULL is ingevuld als er geen overeenkomende overeenkomst is. De resultaten zien er als volgt uit:
Onthoud nu dat we zeiden dat MariaDB en MySQL OUTER JOIN niet ondersteunen. We zeiden ook dat als je een LEFT JOIN toevoegt aan een RIGHT JOIN, je een OUTER JOIN krijgt. De truc in die twee systemen is om precies dat te doen. Dit doen we met de UNION-clausule. Het voegt de resultaten van de ene zoekopdracht toe aan de andere:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
UNION
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
RIGHT JOIN salespeople
ON orders.salesperson_id = salespeople.id;
De resultaten zien er als volgt uit:
MEERDERE JOINs
Met JOIN kunt u ook meer dan twee tabellen verbinden. Als we een volledig verkooprapport met klant- en verkopersinformatie willen, doen we aan het einde gewoon nog een JOIN.
SELECT *
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
LEFT JOIN customer
ON customer.id = orders.customer_id;
In dit voorbeeld beginnen we met de ordertabel en verbinden deze met de verkoperstabel, net zoals we eerder deden. De volgende stap is om de tafel te JOINEN aan de klantentafel. Hiermee wordt alle informatie ingevuld die aan de besteltabel kan worden gekoppeld.
Dit artikel is een korte introductie en is niet bedoeld als een uitputtende bespreking van hoe JOIN kan worden gebruikt in SQL.
Klik hieronder om deze handige coupon vandaag nog te gebruiken!
Liquid Web heeft enkele van de krachtigste databaseservers in de branche. Deze servers kunnen worden gebruikt voor het runnen van de kleinste thuisbedrijf tot de grootste multi-databaseclusters voor grote ondernemingen.
Bel ons op 800.580.4985, of open een chat of ticket met ons om met een van onze ervaren oplossingen of hostingadviseurs te spreken om te leren hoe u vandaag nog van deze technieken kunt profiteren!