SQL engolindo valores? 1 boa prática que resolve o problema

(Última atualização em: 7 de fevereiro de 2017)

Busquei os livros e a quantidade de vendas, mas meu novo livro de introdução a computação não apareceu:

select
  l.nome, count(v.id) as total
  from livros l
  JOIN vendas v on v.livro_id = l.id
  group by l.id;

> Java SE 8 Programmer I, 4200
> Swift: Programe para iPhone e iPad, 3900

Meus livros (tabela da esquerda) são usados com um join com suas vendas (tabela da direita).

O join padrão só traz linhas quando existem valores equivalentes nas duas tabelas… se o livro é novo e não possui venda… não tem linha na tabela da direita… uma pena!

Se quero um join que traga todo mundo da esquerda (meus livros), independentemente de ter alguém na direita, basta usar um join canhoto, o LEFT JOIN:

select
l.nome, count(v.id) as total
from livros l
LEFT JOIN vendas v
on v.livro_id = l.id
group by l.id;

> Java SE 8 Programmer I, 4200
> Swift: Programe para iPhone e iPad, 3900
> Introdução a Computação, 0

Sempre que escrever a palavra JOIN, pare e pense: que tipo de join você deseja? Será que não queria um LEFT JOIN?

Gostou da dica? Recomende a lista para um amigo!

Desafio para a próxima dica: o que tem de horripilante na tabela a seguir?

create table Vendas
(id integer primary key,
valor double);

Tech Education Leader no Alura

  • Bruno Paschoali

    Olá.

    Curiosidade: quando escrevemos LEFT JOIN, implicitamente os gerenciadores de bancos de dados colocam a palavra OUTER pra gente no meio do comando. O comando completo LEFT OUTER JOIN, porém vai dar no mesmo, mais fácil usar só LEFT JOIN.

    Outra coisa: existe também o RIGHT JOIN. Por isso, é necessário saber o lado que traremos mesmo quando forem órfãos (não tiverem valor na tabela do outro lado do JOIN).

    []’s.

Próximo ArtigoMercado de design 2017: saiba as principais novidades para o ano