Lição 3

JOINs e forma da query

Use joins com intenção e reconheça como a forma da query afeta linhas de resultado.

Um join combina linhas de mais de uma tabela. Em código de aplicação, joins geralmente aparecem quando uma entidade referencia outra: pedidos pertencem a usuários, comentários pertencem a posts, faturas pertencem a contas.

SELECT users.email, orders.total
FROM users
JOIN orders ON orders.user_id = users.id
WHERE orders.status = 'paid';

A parte importante é a condição ON. Ela diz ao banco como as linhas se relacionam. Se a condição estiver errada ou faltar, o resultado pode se multiplicar em muito mais linhas do que o esperado.

INNER JOIN vs LEFT JOIN

JOIN geralmente significa inner join: mantém linhas que correspondem em ambos os lados.

LEFT JOIN mantém toda linha da tabela da esquerda, mesmo quando a tabela da direita não tem correspondência:

SELECT users.email, orders.id
FROM users
LEFT JOIN orders ON orders.user_id = users.id;

Isso é útil para "mostrar usuários mesmo sem pedidos", mas também introduz valores NULL no lado direito.

Duplicatas costumam ser um problema de forma da query

Se um usuário tem cinco pedidos, unir users a orders retorna cinco linhas para esse usuário. Isso não é bug de banco. É a forma do relacionamento.

Quando linhas que parecem duplicadas aparecem, pergunte:

  • Este é um relacionamento um-para-muitos?
  • A query deveria agregar linhas em vez disso?
  • A condição de join está faltando parte de uma chave composta?
  • Um LEFT JOIN virou inner join porque um filtro do lado direito foi para WHERE?

Resumo

Leia joins como regras de multiplicação de linhas. Um formatador pode tornar blocos de join visíveis, mas você ainda precisa raciocinar sobre cardinalidade: um-para-um, um-para-muitos e relacionamentos opcionais.

Use o Formatador SQL para tornar cada JOIN e condição ON visíveis antes de revisar resultados da query.

Voltar à visão geral do curso