Duomenų gavimas iš susijusių lentelių Python

Padarykime užklausą, kuri gaus visus vartotojus kartu su jų miestais. Tam prireiks komandos LEFT JOIN:

Jos sintaksė atrodo taip:

sqlSELECT laukai FROM lentelės_pavadinimas
  LEFT JOIN susietos_lentelės_pavadinimas ON ryšio_sąlyga
WHERE atrankos_sąlyga

Išanalizuokime atskiras šios komandos sintaksės dalis.

Laukai

Kadangi atranka vyksta iš kelių lentelių, visų laukų atranka per * neveiks. Ši užklausa pasirinks laukus tik iš pagrindinės lentelės, bet ne iš susietos:

sqlSELECT *

Kad duomenys būtų renkami iš visų lentelių, prieš * reikia nurodyti lentelės pavadinimą atrankai:

sqlSELECT users.*, cities.*

Arba galima išvardinti mums reikalingus laukus nurodant lentelės pavadinimą prieš juos:

sqlSELECT users.name, cities.name

Šie du būdai turi problemą. Taip yra dėl to, kad jei laukai lentelėse turi vienodus pavadinimus, tai Python masyve įvyks pavadinimų konfliktas ir laimės tik vienas laukas, o antrojo nebus.

Problemai spręsti reikia konfliktuojančius pavadinimus pervadinti naudojant komandą as:

sqlSELECT users.name, cities.name as city_name

Ryšys

Po komandos ON turime nurodyti laukus iš dviejų lentelių, pagal kuriuos užmezgamas ryšys. Mūsų atveju tai bus laukas id iš lentelės su miestais ir laukas city_id iš lentelės su vartotojais:

sqlON cities.id=users.city_id

Užklausa

Galų gale užklausa, kuri gaus vartotojus kartu su jų miestais atrodys taip:

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

Praktinės užduotys

Задание 1

Tarkime, kad turite lentelę su produktais ir lentelę su jų kategorijomis. Parašykite užklausą, kuri gaus produktų pavadinimus kartu su jų kategorijomis.