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
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.
-- 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 = NULLheeft, 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):
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
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.
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
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.
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