INNER JOIN vs LEFT JOIN, dat wil zeggen de vraag. Vandaag zullen we kort uitleggen hoe beide van deze twee join-typen worden gebruikt en wat het verschil is. We zullen dit onderwerp later opnieuw bespreken wanneer we ons model uitbreiden en veel complexere queries kunnen schrijven.
Veranderingen in de gegevens
Voordat we INNER JOIN versus LINKS JOIN, laten we eens kijken wat we momenteel weten. Tot nu toe hebben we in deze serie de basisprincipes van de database uitgelegd: hoe u een database en tabellen maakt, hoe u tabellen met gegevens vult en controleert wat erin is opgeslagen met eenvoudige zoekopdrachten. We hebben in het vorige artikel zelfs aan twee tafels deelgenomen. Nu zijn we klaar voor de volgende stap.
Maar laten we voordat we verder gaan, slechts een kleine wijziging aanbrengen in onze gegevens. We voegen 2 rijen toe aan de landentabel met de volgende INSERT INTO-commandos:
Nu zullen we de inhoud van beide tabellen controleren:
U kunt gemakkelijk zien dat we 2 nieuwe rijen hebben in het tabelland, een voor Spanje en een voor Rusland. Hun ids zijn 6 en 7. Merk ook op dat er in de stadstabel geen country_id met waarde 6 of 7 staat. Dit betekent simpelweg dat we geen stad uit Rusland of Spanje in onze database hebben. We zullen dit feit later gebruiken.
INNER JOIN
Laten we deze twee vragen bespreken:
Het resultaat dat ze retourneren wordt weergegeven op de onderstaande afbeelding:
Beide zoekopdrachten geven exact hetzelfde resultaat. Dit is niet toevallig, maar het resultaat van het feit dat dit dezelfde vraag is die op twee verschillende manieren is geschreven. Beide manieren zijn correct, en je kunt ze allemaal gebruiken.
In de eerste zoekopdracht hebben we alle tabellen opgesomd die we gebruiken in het FROM-gedeelte van de zoekopdracht (FROM land, stad) en gingen toen met de join voorwaarde in het WHERE-gedeelte van de zoekopdracht (WHERE city.country_id = country.id). In het geval dat we zouden vergeten deze join-voorwaarde op te schrijven, zouden we het Cartesiaans product van beide tabellen hebben.
In de tweede query hebben we slechts één tabel in het FROM-gedeelte van de query (FROM country) en dan hebben we de tweede tabel en de JOIN-voorwaarde in het JOIN-gedeelte van de query (INNER JOIN city ON city.country_id = country.id).
Hoewel beide vragen goed zijn geschreven, zou ik willen voorstellen dat je gebruikt altijd INNER JOIN in plaats van tabellen op te sommen en ze samen te voegen in het WHERE-gedeelte van de query. Daar zijn een paar redenen voor:
- De leesbaarheid is veel beter omdat de gebruikte tabel en de gerelateerde JOIN-voorwaarde zich in dezelfde lijn. Je kunt gemakkelijk zien of je de JOIN-voorwaarde hebt weggelaten of niet.
- Als je later andere JOINs wilt gebruiken (LINKS of RECHTS), zou je dat niet (gemakkelijk) kunnen doen, tenzij je eerder INNER JOIN hebt gebruikt dat
Laten we nu eens kijken welke zoekopdrachten daadwerkelijk zijn geretourneerd:
- Alle paren van landen en steden die verwant zijn (via externe sleutel)
- We hebben geen 2 landen in de lijst (Spanje en Rusland), omdat ze geen gerelateerde stad hebben in de stadstabel
LINKS AANMELDEN
Ik herhaal dit – “We hebben geen 2 landen op de lijst (Spanje en Rusland) omdat ze geen gerelateerde stad in de stadstabel hebben”. Dit zal cruciaal blijken bij het vergelijken van INNER JOIN versus LEFT JOIN.
In sommige gevallen willen we zelfs deze records in onze resultaten hebben. U wilt bijvoorbeeld gewoon in het resultaat zien dat deze landen geen gerelateerde records in een andere tabel hebben. Dit kan een onderdeel zijn van enige controle, of misschien gewoon zaken tellen, enz. Wat de motivatie achter dat verlangen ook is, we zouden dat technisch in staat moeten zijn. En wij zijn. In databases doet LEFT JOIN precies dat.
Het resultaat van LEFT JOIN zal hetzelfde zijn als het resultaat van INNER JOIN + we hebben rijen uit de “left” -tabel, zonder een paar in de “juiste” tafel. We gebruiken dezelfde INNER JOIN-zoekopdracht en vervangen het woord INNER door LEFT. Dit is het resultaat:
U kunt gemakkelijk zien dat we nog 2 rijen hebben, vergeleken met het resultaat van de INNERLIJKE JOIN-zoekopdracht. Dit zijn rijen voor Rusland en Spanje. Omdat ze allebei geen gerelateerde stad hebben, hebben alle stadsattributen in deze twee rijen NULL-waarden (zijn niet gedefinieerd). Dat is het grootste verschil wanneer je INNER JOIN versus LEFT JOIN vergelijkt.
RIGHT JOIN
Je hoort in ieder geval over de RIGHT JOIN. Het wordt zelden gebruikt omdat het hetzelfde resultaat retourneert als de LEFT JOIN. Aan de andere kant zijn querys die LEFT JOIN gebruiken veel gemakkelijker te lezen omdat we de tabellen gewoon achter elkaar weergeven.
Dit is het equivalent van de vorige query met de RIGHT JOIN:
U kunt zien dat de geretourneerde waarden hetzelfde zijn, alleen in dit geval staan de waarden uit de stadstabel in de eerste 5 kolommen, en land- gerelateerde waarden komen erachter.
INNER JOIN vs LEFT JOIN
INNER JOIN vs LEFT JOIN?Eigenlijk is dat helemaal niet de vraag. Je gebruikt INNER JOIN als je alleen records met een paar aan beide kanten wilt retourneren, en je gebruikt LEFT JOIN als je alle records uit de “linker” tabel nodig hebt, ongeacht of ze een paar in de “rechter” tabel hebben of niet. Als je alle records van beide tabellen nodig hebt, ongeacht of ze een paar hebben, moet je CROSS JOIN gebruiken (of simuleren met LEFT JOINs en UNION). Daarover meer in de komende artikelen.
Inhoudsopgave
SQL leren: CREATE DATABASE & CREATE TABLE Operations
SQL leren: INSERT IN TABLE
SQL leren: primaire sleutel
SQL leren: externe sleutel
SQL leren: SELECT-instructie
SQL leren: INNER JOIN versus LEFT JOIN
SQL leren: SQL-scripts
SQL leren: soorten relaties
SQL leren: meerdere tabellen samenvoegen
SQL leren: geaggregeerde functies
Leren SQL: hoe schrijf je een complexe SELECT-query
Leer SQL: de INFORMATION_SCHEMA-database
Leer SQL: SQL-gegevenstypen
SQL leren: set-theorie
SQL leren: door de gebruiker gedefinieerde functies
SQL leren: door de gebruiker gedefinieerde opgeslagen procedures
SQL leren: SQL-weergaven
SQL leren: SQL-triggers
SQL leren: SQL-queries oefenen
SQL leren: voorbeelden van SQL-querys
SQL leren: handmatig een rapport maken SQL-querys gebruiken
SQL leren: SQL Server datum- en tijdfuncties
SQL leren: SQL Server-rapporten maken met datum- en tijdfuncties
SQL leren: SQL Server-draaitabellen
SQL leren: SQL Server exporteren naar Excel
SQL leren: inleiding tot SQL Server-loops
SQL leren: SQL Server-cursors
SQL leren: SQL-best practices voor het verwijderen en bijwerken van gegevens
SQL leren: naamgevingsconventies
SQL leren: SQL-gerelateerde taken
SQL leren: niet-Equi joins in SQL Server
SQL leren: SQL Injectie
- Auteur
- Recente berichten
Zijn vroegere en huidige opdrachten variëren van database-ontwerp en codering tot lesgeven, adviseren en schrijven over databases. Ook niet te vergeten, BI, algoritmen maken, schaken, filatelie, 2 honden, 2 katten, 1 vrouw, 1 baby …
Je kunt hem vinden op LinkedIn
Bekijk alle berichten van Emil Drkusic
- SQL leren: SQL-injectie – 2 november 2020
- SQL leren: niet-Equi joins in SQL Server – 29 september 2020
- SQL leren: SQL-gerelateerde vacatures – 1 september 2020