Obtendo dados de tabelas relacionadas em Python

Vamos fazer uma consulta que irá buscar todos os usuários junto com suas cidades. Para isso será necessário o comando LEFT JOIN:

Sua sintaxe é a seguinte:

sqlSELECT campos FROM nome_da_tabela
  LEFT JOIN nome_da_tabela_relacionada ON condição_de_ligação
WHERE condição_de_seleção

Vamos analisar as partes individuais da sintaxe deste comando.

Campos

Como a seleção é feita a partir de várias tabelas, selecionar todos os campos com * não funcionará. A seguinte consulta selecionará campos apenas da tabela principal, mas não da tabela relacionada:

sqlSELECT *

Para que os dados sejam selecionados de todas as tabelas, é necessário especificar o nome da tabela antes do *:

sqlSELECT users.*, cities.*

Ou pode-se listar os campos que precisamos especificando o nome da tabela antes deles:

sqlSELECT users.name, cities.name

Estas duas formas têm um problema. A questão é que se os campos nas tabelas tiverem o mesmo nome, no array Python haverá um conflito de nomes e apenas um campo "vencerá", e o segundo não estará presente.

Para resolver o problema, é necessário renomear os nomes em conflito usando o comando as:

sqlSELECT users.name, cities.name as nome_da_cidade

Ligação (JOIN)

Após o comando ON, devemos especificar os campos das duas tabelas pelos quais a ligação é feita. No nosso caso, será o campo id da tabela de cidades e o campo city_id da tabela de usuários:

sqlON cities.id=users.city_id

Consulta

No final, a consulta que irá buscar os usuários junto com suas cidades ficará da seguinte forma:

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

Tarefas práticas

Задание 1

Suponha que você tenha uma tabela de produtos e uma tabela de suas categorias. Escreva uma consulta que irá buscar os nomes dos produtos junto com suas categorias.