Získávání dat z propojených tabulek v Pythonu

Pojďme vytvořit dotaz, který načte všechny uživatele spolu s jejich městy. K tomu bude potřeba příkaz LEFT JOIN:

Jeho syntaxe vypadá následovně:

sqlSELECT pole FROM název_tabulky
  LEFT JOIN název_propojené_tabulky ON podmínka_propojení
WHERE podmínka_výběru

Pojďme rozebrat jednotlivé části syntaxe tohoto příkazu.

Pole

Protože se výběr provádí z několika tabulek, výběr všech polí pomocí * nebude fungovat. Následující dotaz vybere pole pouze z hlavní tabulky, ale ne z propojené:

sqlSELECT *

Aby se data vybírala ze všech tabuliek, je třeba před * uvést název tabulky pro výběr:

sqlSELECT users.*, cities.*

Nebo lze vypsat potřebná pole s uvedením názvu tabulky před nimi:

sqlSELECT users.name, cities.name

Tyto dva způsoby mají problém. Spočívá v tom, že pokud mají pole v tabulkách stejné názvy, dojde v poli Pythonu ke konfliktu jmen a vyhraje pouze jedno pole, druhé nebude k dispozici.

K vyřešení problému je třeba konfliktní názvy přejmenovat pomocí příkazu as:

sqlSELECT users.name, cities.name as city_name

Propojení

Po příkazu ON musíme uvést pole ze dvou tabulek, podle kterých se provádí propojení. V našem případě to bude pole id z tabulky s městy a pole city_id z tabulky s uživateli:

sqlON cities.id=users.city_id

Dotaz

Výsledný dotaz, který načte uživatele spolu s jejich městy, bude vypadat následovně:

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

Praktické úlohy

Задание 1

Předpokládejme, že máte tabulku s produkty a tabulku s jejich kategoriemi. Napište dotaz, který načte názvy produktů spolu s jejich kategoriemi.