SQL engolindo valores? 1 boa prática que resolve o problema
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
?
Desafio para a próxima dica: o que tem de horripilante na tabela a seguir?
create table Vendas (id integer primary key, valor double);