Gegevens ophalen uit gerelateerde tabellen in Python
Laten we een query maken die
alle gebruikers ophaalt samen met hun steden. Hiervoor
is de opdracht LEFT
JOIN nodig:
De syntaxis ziet er als volgt uit:
SELECT velden FROM tabel_naam
LEFT JOIN gerelateerde_tabel_naam ON koppel_voorwaarde
WHERE selectie_voorwaarde
Laten we de afzonderlijke onderdelen van de syntaxis van deze opdracht bekijken.
Velden
Omdat de selectie uit meerdere tabellen komt,
werkt het selecteren van alle velden met *
niet. De volgende query selecteert
velden alleen uit de hoofdtable, maar niet uit
de gerelateerde tabel:
SELECT *
Om gegevens uit alle tabellen te selecteren,
moet je voor * de tabelnaam
voor de selectie opgeven:
SELECT users.*, cities.*
Of je kunt de gewenste velden opsommen met vermelding van de tabelnaam ervoor:
SELECT users.name, cities.name
Deze twee methoden hebben een probleem. Het zit zo, dat als velden in de tabellen dezelfde namen hebben, er in de Python-lijst een naamconflict ontstaat en er maar één veld overblijft, en het tweede veld niet aanwezig zal zijn.
Om het probleem op te lossen moeten conflicterende
namen worden hernoemd met de opdracht
as:
SELECT users.name, cities.name as city_name
Koppeling
Na de opdracht ON moeten we de
velden uit de twee tabellen opgeven, waarmee de
koppeling wordt gemaakt. In ons geval is dit het veld id
uit de tabel met steden en het veld city_id
uit de tabel met gebruikers:
ON cities.id=users.city_id
Query
Uiteindelijk ziet de query die de gebruikers samen met hun steden ophaalt er als volgt uit:
SELECT
users.name, cities.name as city_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
Praktische opdrachten
Stel je hebt een tabel met producten en een tabel met hun categorieën. Schrijf een query, die de productnamen ophaalt samen met hun categorieën.