Pobieranie danych z powiązanych tabel w Pythonie
Wykonajmy zapytanie, które pobierze
wszystkich użytkowników wraz z ich miastami. Do tego
będzie potrzebne polecenie LEFT
JOIN:
Jego składnia wygląda następująco:
SELECT pola FROM nazwa_tabeli
LEFT JOIN nazwa_tabeli_powiązanej ON warunek_powiązania
WHERE warunek_wybioru
Przeanalizujmy poszczególne części składni tego polecenia.
Pola
Ponieważ wybór odbywa się z kilku tabel,
wybór wszystkich pól za pomocą * nie
będzie działać. Następujące zapytanie wybierze
pola tylko z tabeli głównej, ale nie z
tabeli powiązanej:
SELECT *
Aby dane były wybierane ze wszystkich
tabel, należy przed * podać nazwę
tabeli do wyboru:
SELECT users.*, cities.*
Albo można wypisać potrzebne nam pola z podaniem nazwy tabeli przed nimi:
SELECT users.name, cities.name
Te dwa sposoby mają problem. Chodzi o to, że jeśli pola w tabelach mają identyczne nazwy, to w tablicy Python nastąpi konflikt nazw i zwycięży tylko jedno pole, a drugiego nie będzie.
Aby rozwiązać problem, należy zmienić nazwy
konfliktowych pól za pomocą polecenia
as:
SELECT users.name, cities.name as city_name
Powiązanie
Po poleceniu ON musimy określić
pola z dwóch tabel, za pomocą których realizowane jest
powiązanie. W naszym przypadku będzie to pole id
z tabeli z miastami i pole city_id
z tabeli z użytkownikami:
ON cities.id=users.city_id
Zapytanie
Ostatecznie zapytanie, które pobierze użytkowników wraz z ich miastami będzie wyglądać następująco:
SELECT
users.name, cities.name as city_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
Zadania praktyczne
Załóżmy, że masz tabelę z produktami i tabelę z ich kategoriami. Napisz zapytanie, które pobierze nazwy produktów razem z ich kategoriami.