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:

sqlSELECT 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:

sqlSELECT *

Aby dane były wybierane ze wszystkich tabel, należy przed * podać nazwę tabeli do wyboru:

sqlSELECT users.*, cities.*

Albo można wypisać potrzebne nam pola z podaniem nazwy tabeli przed nimi:

sqlSELECT 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:

sqlSELECT 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:

sqlON 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:

sqlSELECT
  users.name, cities.name as city_name
FROM
  users
LEFT JOIN cities ON cities.id=users.city_id

Zadania praktyczne

Задание 1

Załóżmy, że masz tabelę z produktami i tabelę z ich kategoriami. Napisz zapytanie, które pobierze nazwy produktów razem z ich kategoriami.