Direct naar de hoofdinhoud
Module 3 · Les 1 van 49/57 in de cursus~12 min
Modulelessen (1/4)

Twee tabellen samenvoegen: INNER JOIN

Tot nu toe hebben we tabel voor tabel gelezen. In de echte wereld zijn data dat wel verdeeld over meerdere gerelateerde tabellen: in onze dataset bijvoorbeeld elk werknemer heeft een department_id die verwijst naar de tabel departments. Om te zien de naam van de afdeling (en niet alleen de id) die we nodig hebben om deel te nemen aan de twee tafels. De operator die dit doet heet JOIN.

De basissyntaxis

SQL
SELECT columns
FROM   table_a
JOIN   table_b ON table_a.x = table_b.y;

In het Engels gelezen: "neem table_a, voeg table_b eraan toe door elke rij waarbij table_a.x gelijk is aan table_b.y". Het resultaat is een nieuwe virtuele tabel met de kolommen van beide.

SQL
-- For each employee, also show the name of their department:
SELECT employees.first_name,
       employees.last_name,
       departments.name AS dipartimento
FROM   employees
JOIN   departments ON employees.department_id = departments.id;

Het gedeelte na ON wordt de join condition genoemd: dit vertelt de engine "deze twee rijen zijn ongeveer hetzelfde, lijn ze uit". In de in de overgrote meerderheid van de gevallen is het een gelijkheid tussen een primaire sleutel en een buitenlandse sleutel sleutel (hier departments.id en employees.department_id).

INNER JOIN, in detail

Het volledige zoekwoord is INNER JOIN, maar JOIN op zichzelf is de standaard synoniem. 'Binnen' betekent dat alleen de rijen die een overeenkomst hebben in beide tabellen worden geretourneerd:

  • als een medewerker department_id = NULL heeft, verschijnt deze niet in de resultaat;
  • als een afdeling geen medewerkers heeft, wordt dit niet weergegeven in het resultaat.

Kwalificerende kolomnamen

Wanneer twee tabellen kolommen met dezelfde naam hebben (hier hebben beide id, en beide hebben name als je erover nadenkt), moet je welke tabel opgeven een kolom komt vandaan door table.column te schrijven. Om herhaling van lange namen te voorkomen, aliassen worden vaak gebruikt (je zag ze in Module 2):

SQL
SELECT e.first_name, e.last_name, d.name AS dipartimento
FROM   employees   AS e
JOIN   departments AS d ON e.department_id = d.id;

AS is ook hier optioneel: FROM employees e werkt hetzelfde.

Probeer het

Oefening#sql.m3.l1.e1
Pogingen: 0Laden…

Toon voor elke medewerker op de afdeling Ingegneria de voornaam (voornaam), achternaam (achternaam) en de stad van de afdeling (departments.city). Drie kolommen, één rij per medewerker.

Editor laden…
Toon hint

Vul de ON-voorwaarde in met de gelijkheid tussen e.department_id en d.id en selecteer vervolgens d.city als derde kolom.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#sql.m3.l1.e2
Pogingen: 0Laden…

Vermeld de voornaam (voornaam) en achternaam (achternaam) van alle werknemers die op een afdeling in Milaan werken. Filter op afdelingen.stad, niet op de afdelingsnaam.

Editor laden…
Toon hint

Zelfde JOIN als de vorige oefening, maar filter op d.city = 'Milano' in plaats van op de afdelingsnaam.

Oplossing beschikbaar na 3 pogingen