SQLShack (Nederlands)

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
Emil is een databaseprofessional met meer dan 10 jaar ervaring in alles wat met databases te maken heeft. Gedurende de jaren werkte hij in de IT- en financiële sector en werkt nu als freelancer.
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

Laatste berichten door Emil Drkusic (bekijk alle)
  • 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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *