Obținerea datelor din tabele relaționate în Python
Să facem o interogare care va extrage
toți utilizatorii împreună cu orașele lor. Pentru aceasta
va fi necesară comanda LEFT
JOIN:
Sintaxa sa arată în felul următor:
SELECT câmpuri FROM nume_tabel
LEFT JOIN nume_tabel_relaționat ON condiția_legăturii
WHERE condiția_selecției
Să analizăm părțile individuale ale sintaxei acestei comenzi.
Câmpurile
Deoarece selecția se face din mai multe tabele,
selectarea tuturor câmpurilor prin * nu
va funcționa. Următoarea interogare va selecta
câmpurile doar din tabelul principal, dar nu și din
tabelul relaționat:
SELECT *
Pentru ca datele să fie selectate din toate
tabelele, este necesar să se indice înainte de * numele
tabelului pentru selecție:
SELECT users.*, cities.*
Sau se pot enumera câmpurile de care avem nevoie cu indicarea numelui tabelului înaintea lor:
SELECT users.name, cities.name
Aceste două metode au o problemă. Ideea este că dacă câmpurile din tabele au aceleași nume, atunci în array-ul Python va apărea un conflict de nume și va câștiga doar un câmp, iar al doilea nu va exista.
Pentru a rezolva problema, este necesar să se redenumească
numele conflictuale prin comanda
as:
SELECT users.name, cities.name as city_name
Legătura
După comanda ON trebuie să indicăm
câmpurile din cele două tabele, prin care se realizează
legătura. În cazul nostru, acestea vor fi câmpul id
din tabela cu orașe și câmpul city_id
din tabela cu utilizatori:
ON cities.id=users.city_id
Interogarea
În final, interogarea care va extrage utilizatorii împreună cu orașele lor va arăta în felul următor:
SELECT
users.name, cities.name as city_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
Probleme practice
Să presupunem că aveți o tabelă cu produse și o tabelă cu categoriile lor. Scrieți o interogare, care va extrage denumirile produselor împreună cu categoriile lor.