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:
SELECT 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:
SELECT *
Kad duomenys būtų renkami iš visų
lentelių, prieš * reikia nurodyti
lentelės pavadinimą atrankai:
SELECT users.*, cities.*
Arba galima išvardinti mums reikalingus laukus nurodant lentelės pavadinimą prieš juos:
SELECT 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:
SELECT 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:
ON cities.id=users.city_id
Užklausa
Galų gale užklausa, kuri gaus vartotojus kartu su jų miestais atrodys taip:
SELECT
users.name, cities.name as city_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
Praktinės užduotys
Tarkime, kad turite lentelę su produktais ir lentelę su jų kategorijomis. Parašykite užklausą, kuri gaus produktų pavadinimus kartu su jų kategorijomis.