De database transacties bestaat uit meerdere tabellen. Dat is niet zomaar gebeurd. Er zijn goede redenen om de informatie te verspreiden over verschillende tabellen. In de vorige onderdelen heb je geleerd hoe je met behulp van SQL informatie kunt halen uit één tabel. Om een antwoord op een vraag te krijgen, zal het echter vaak nodig zijn om de informatie uit meerdere tabellen te combineren. In een relationele database worden twee tabellen gecombineerd tot een nieuwe tabel door ze te koppelen (in het Engels: join). Als je daarbij niet oppast, kan dat tot vreemde resultaten leiden.
We nemen als voorbeeld de administratie van een buurtvereniging. Die bestaat uit twee tabellen: leden en kinderen.
Om een uitnodiging te maken voor een spelletjesmiddag wil de organisatie een lijst van de roepnamen van de kinderen, hun achternamen en adressen hebben.
In een SQL-query geef je bij FROM aan welke tabellen geraadpleegd moeten worden. Als je meer dan één tabel opgeeft, worden de tabellen eerst gecombineerd tot één tabel. Daarna wordt die combinatietabel gebruikt om de gewenste informatie te vinden.
De volgende query heeft als resultaat een combinatietabel:
SELECT roepnaam, naam, adres,
FROM leden, kinderen
Het resultaat van deze query zal niet de lijst opleveren die de organisatie had beoogd:
In deze lijst zijn alle mogelijke combinaties van rijen uit de twee tabellen afgedrukt: ieder kind wordt drie keer afgedrukt: een keer met zijn eigen achternaam en adres en daarnaast met de namen en adressen van de andere leden. Dit levert dus 12 (4 x 3 ) rijen op (Elke rij uit de tabel kinderen wordt gecombineerd met elke rij uit de tabel leden.).
Als er vijftig gezinnen lid zijn van de buurtvereniging en die gezinnen zouden samen honderd kinderen hebben, dan levert deze query 50 x 100 = 5000 rijen op in de combinatietabel waarvan de meeste rijen geen relevante informatie opleveren.
De organisatie wil alleen de combinatie van de roepnaam bij de juiste achternaam en adres. Daarvoor zoeken we in de beide tabellen naar iets gemeenschappelijks. In dit voorbeeld is dat de kolom lidnr. Wanneer er voor een rij geldt dat het lidnummer in de tabel leden gelijk is aan het lidnr in de tabel kinderen dan zal het een gewenste combinatie opleveren. In de SQL-opdracht komt deze voorwaarde achter de WHERE‑component te staan:
SELECT roepnaam, naam, adres
FROM leden, kinderen
WHERE leden.lidnr = kinderen.lidnr
In de WHERE-component komt twee keer de kolom lidnr voor. Om duidelijk te maken welke kolom je bedoelt, zet je voor de kolomnaam de naam van de tabel en een punt. De aanduiding van een kolom heeft de volgende basisstructuur: tabelnaam.kolomnaam .
In dit voorbeeld staat de informatie die je wilt hebben in twee tabellen verspreid. Het kan ook voorkomen dat je drie of meer tabellen moet gebruiken om de informatie te krijgen, die je wilt hebben. In dat geval zet je achter de FROM-component de namen van de tabellen en koppel je achter de WHERE-component steeds twee tabellen aan elkaar.