SQL Server Essentials: Gebruik van SQL Joins

In relaties databases zoals SQL Server, gebruikt men de SQL JOIN-instructie om gegevens uit meerdere tabellen op te halen op basis van de gegevensrelaties tussen die tabellen. U kunt de SQL JOIN-instructie gebruiken met twee of meer tabellen, en het retourneert essentieel records die matching waarden hebben in de verschillende tabellen. In dit handleiding zal ik u vertellen hoe u de meest voorkomende SQL JOIN-typen kunt gebruiken inclusief de SQL INNER JOIN, de SQL LEFT JOIN, de SQL RIGHT JOIN en de SQL OUTER JOIN.

SQL Joins is een noodzakelijke functie om te gebruiken bij het werken met relaties databases. Ze worden voornamelijk uitgevoerd met behulp van de SQL SELECT-instructie. U kunt meer leren over het beginnen met de T-SQL SELECT-instructie in mijn vorige artikel over SQL Servers: Gebruik van SQL SELECT en de WHERE en HAVING Klausules om Gegevens op te halen.

Advertentie

SQL INNER JOIN

De SQL INNER JOIN-bewerking creëert een resultaatset door rijen combineren die matching waarden hebben in twee of meer tabellen. Dit is waarschijnlijk de meest gebruikte joinbewerking in T-SQL. SQL INNER JOIN retourneert alleen rijen met matching waarden, en het wordt gebruikt om gegevens op te halen die in alle tabellen voorkomen.

Het volgende diagram illustreert hoe een SQL INNER JOIN-bewerking werkt met twee tabellen.

How an SQL INNER JOIN operation works with two tables (Image credit: Petri/Michael Otey)

De syntaxis voor een INNER JOIN is redelijk eenvoudig. Als onderdeel van uw SELECT-opdracht geeft u de twee tabellen aan die u samenvoegt en de kolommen op die u gebruikt om rijen bij elkaar te matchen.

Laten we een kijkje nemen bij twee tabellen uit de AdventureWorksLT2019-voorbeelddatabase. Als we de SalesLT.Customer en SalesLT.SalesOrderHeader tabellen gebruiken, kunnen we een SQL INNER JOIN gebruiken om de bestellingen voor de klanten in de SalesLT.Customer tabel op te halen door de twee tabellen op de CustomerID-kolom te laten samenvoegen, die een gemeenschappelijke kolom is in beide tabellen.

Advertentie

Hier is de T-SQL-query die u kunt gebruiken om dat te bereiken:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate 
FROM SalesLT.Customer c
INNER JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID

Hier zie je hoe de syntaxis van de SQL INNER JOIN werkt:

  • Hier zie je dat we de kolommen ‘CustomerID’, ‘FirstName’ en ‘LastName’ selecteert uit de SalesLT.Customer tabel, en de kolommen ‘SalesOrderID’ en ‘OrderDate’ uit de SalesLT.SalesOrderHeader tabel.
  • De ‘c’ en ‘soh’ zijn afkortingen voor tabelalias die het nodige zijn om altijd de volledige tabelnaam te gebruiken bij het verwijzen naar kolommen.
  • We gebruiken de INNER JOIN-keyword om de twee tabellen samen te voegen. De ON-keyword specificeert de kolom die u gebruikt voor de samenvoeging. Hier is het de ‘CustomerID’-kolom.

Deze query retourneert een resultaatset die de kolommen ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ en ‘OrderDate’ bevat voor elke klant die een bestelling heeft geplaatst, zoals te zien is in de volgende figuur.

The result of our SQL INNER JOIN query (Image credit: Petri/Michael Otey)

SQL LINKER JOIN

De SQL LEFT OUTER JOIN-operatie zal ook een resultaatset maken door rijen tussen onze twee voorgaande tabellen te matchen. Met de SQL LEFT JOIN worden echter, als er geen records overeenkomen vanuit de linker tabel, die records met null-waarden weergegeven.

Advertentie

Dit is handig wanneer u alle rijen uit de eerste tabel wilt opnemen en alleen de overeenkomende rijen uit de tweede tabel, zelfs als er geen overeenkomst is in de rechtertabel. De SQL LEFT OUTER JOIN retourneert null-waarden in kolommen van de rechtertabel als er geen overeenkomst is.

De volgende diagram illustreert hoe een SQL LEFT OUTER JOIN-operatie werkt met twee tabellen.

How an SQL LEFT OUTER JOIN works with two tables (Image credit: Petri/Michael Otey)

De syntaxis voor de LEFT JOIN is ook vrij eenvoudig. Als onderdeel van de SELECT-verklaring geeft u de twee tabellen op om samen te voegen, de kolommen om rijen mee overeen te laten komen en de LEFT JOIN-clausule.

Laten we eens wat beter kijken naar twee tabellen uit de AdventureWorksLT2019-database. Bijvoorbeeld, om alle klanten en eventuele bestellingen die ze hebben op te halen, kunt u de tabellen SalesLT.Customer en SalesLT.SalesOrderHeader gebruiken en een LEFT JOIN uitvoeren zoals te zien is in het volgende overzicht:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate
FROM SalesLT.Customer c 
LEFT JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  • In dit voorbeeld selecteren we de kolommen ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ en ‘OrderDate’ uit de tabellen SalesLT.Customer en SalesLT.SalesOrderHeader.
  • We gebruiken het LEFT JOIN-sleutelwoord om de twee tabellen te koppelen en het ON-sleutelwoord dat we zullen gebruiken in de kolom ‘CustomerID’ om de twee tabellen te koppelen.

U kunt de resultaten van deze SQL LEFT JOIN-query zien in de onderstaande figuur.

The results of our SQL LEFT JOIN query (Image credit: Petri/Michael Otey)

Deze query retourneert een resultaat dat alle klanten in de SalesLT.Customer-tabel bevat, samen met eventuele overeenkomstige orderinformatie uit de SalesLT.SalesOrderHeader-tabel. Als een klant geen bestellingen heeft in de SalesLT.SalesOrderHeader-tabel, zullen de kolommen van die tabel leeg zijn. U kunt verschillende lege waarden zien in de vorige figuur.

SQL RIGHT JOIN

Zoals je zou kunnen raden, is de SQL RIGHT OUTER JOIN-operatie in feite het tegenovergestelde van de LEFT OUTER JOIN. De RIGHT OUTER JOIN selecteert gegevens uit de rechtertabel (Tabel 2) en koppelt deze gegevens met de rijen uit de linkertabel (Tabel 1).

De RIGHT JOIN retourneert een resultaat dat alle rijen in de rechtertabel bevat, zelfs als ze geen overeenkomstige rijen hebben uit de linkertabel. Als een rij in de rechtertabel geen overeenkomstige rij heeft in de linkertabel, zullen de resultaten voor de kolommen van de linkertabel leeg zijn.

Het volgende diagram illustreert hoe een RIGHT JOIN werkt met twee tabellen:

How a right JOIN works with two tables (Image credit: Petri/Michael Otey)

We kunnen dit laten zien met de SalesLT.Customer en SalesLT.SalesOrderHeader uit de AdventuresLT2019-database. Om alle bestellingen en de overeenkomstige klantgegevens op te halen, kunt u een RIGHT JOIN-query gebruiken zoals u kunt zien in het volgende voorbeeld:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate
FROM SalesLT.Customer c 
RIGHT JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  • In dit voorbeeld selecteren we de kolommen ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ en ‘OrderDate’ uit de tabellen SalesLT.Customer en SalesLT.SalesOrderHeader.
  • Het trefwoord RIGHT JOIN wordt gebruikt om de twee tabellen samen te voegen, en het trefwoord ON geeft aan dat we de twee tabellen samenvoegen op basis van de kolom ‘CustomerID’.

Deze query retourneert een resultaatset met alle bestellingen in de tabel SalesLT.SalesOrderHeader, samen met de bijbehorende klantinformatie uit de tabel SalesLT.Customer indien beschikbaar. Als een bestelling geen overeenkomende klant heeft in de tabel SalesLT.Customer, zullen de klantkolommen in de resultaatset leeg zijn.

Je zult merken dat deze query erg lijkt op de vorige query. Echter, de LEFT JOIN resulteerde in veel rijen van de SaleOrderHeader tabel met lege waardes. Onze laatste query heeft echter geen lege waardes in de rijen van de SaleOrderHeader tabel.

De resultaten van onze SQL RIGHT OUTER JOIN operatie worden getoond in de volgende figuur.

The results of our SQL RIGHT OUTER JOIN operation (Image credit: Petri/Michael Otey)

SQL OUTER JOIN

SQL OUTER JOIN is niet de meest voorkomende soort join operatie. Soms ook wel een FULL JOIN genoemd, de OUTER JOIN query haalt niet alleen de overeenkomende rijen op, maar ook de niet-overeenkomende rijen. Met andere woorden, het retourneert gegevens van de samengevoegde tabel wanneer er een overeenkomst is in zowel de linker- als rechtertabellen.

Zoals je misschien al vermoedde, leidt dit meestal tot grotere resultaatsets dan de andere join types. Het volgende diagram illustreert hoe een SQL OUTER JOIN werkt met twee tabellen.

How an SQL OUTER JOIN works with two tables (Image credit: Petri/Michael Otey)

I’ll give you an example of an SQL OUTER JOIN operation using the SalesLT.SalesOrderHeader and SalesLT.SalesOrderDetail tables. Here, we want to retrieve all sales orders and their associated details, including orders that don’t have any details records.

Om dit te doen, kunnen we een VOLLEDIGE BUITENJOIN gebruiken. Dit zal ook alle SalesOrderDetail-rijen retourneren die geen overeenkomende SalesOrderHeader-rij hadden. In de meeste normale gevallen zouden alle SalesOrderDetails-rijen een overeenkomende SalesOrderHeader-rij moeten hebben, maar dit kan niet het geval zijn als er een toepassings- of systeemfout is opgetreden die hiermee kan worden gedetecteerd.

Hier is een T-SQL-query die een voorbeeld van een VOLLEDIGE BUITENJOIN toont:

USE AdventureWorksLT2019

SELECT soh.SalesOrderID, soh.OrderDate, sod.ProductID, sod.OrderQty, sod.UnitPrice
FROM SalesLT.SalesOrderHeader soh
FULL OUTER JOIN SalesLT.SalesOrderDetail sod
ON soh.SalesOrderID = sod.SalesOrderID
  • In dit voorbeeld selecteren we de kolommen ‘SalesOrderID’, ‘OrderDate’, ‘ProductID’, ‘Quantity’ en ‘UnitPrice’ uit zowel de tabellen SalesLT.SalesOrderHeader als SalesLT.SalesOrderDetail.
  • We gebruiken het VOLLEDIGE BUITENJOIN-keyword om de twee tabellen te koppelen, en het ON-keyword om aan te geven dat de kolom SalesOrderID zal worden gebruikt om de twee tabellen te koppelen.
  • Deze query retourneert een resultaatset die alle verkooporders in de tabel SalesLT.SalesOrderHeader bevat, samen met hun bijbehorende detailinformatie uit de tabel SalesLT.SalesOrderDetail. Het zal ook alle details in de tabel SalesLT.SalesOrderDetail bevatten, samen met hun bijbehorende orderheaderinformatie als die beschikbaar is.
  • Als een verkooporder geen details heeft in de tabel SalesLT.SalesOrderDetail, zullen de kolommen NULL zijn. Als een detail geen overeenkomende verkooporder heeft in de tabel SalesLT.SalesOrderHeader, zullen de verkooporderkolommen NULL zijn.

De resultaten van deze VOLLEDIGE BUITENJOIN-operatie worden getoond in de volgende figuur.

The results of our FULL OUTER JOIN operation (Image credit: Petri/Michael Otey)

Het leren van de basisprincipes van SQL Joins

In deze tutorial behandelde ik de meest voorkomende verschillende soorten SQL JOINS. Ik liet zien hoe je de INNER JOIN, de LEFT JOIN, de RIGHT JOIN en de OUTER JOIN kunt gebruiken, en legde ook uit hoe ze verschillen en waar ze kunnen worden gebruikt. In een aankomende post zal ik enkele minder voorkomende joins behandelen, zoals de CROSS JOIN en de SELF JOIN, dus blijf op de hoogte bij Petri!

Gerelateerd artikel:

Source:
https://petri.com/sql-join/