O comando JOIN do SQL tem a função básica de agregar tabelas mediante um campo que faça sentido às mesmas.
Por exemplo, considerando o diagrama hipotético abaixo, caso eu queira como retorno todas as compras de um cliente, poderia retornar algo como:
SELECT * FROM cliente JOIN compra ON idcliente
Mas e se eu quero retornar somente os clientes que estão ligados a uma compra? Ou compras que não estão ligadas a nenhum cliente cadastro?
Para esses tipos de consultas mais complexas existe uma série de complementos para o JOIN, dos quais os mais utilizados são INNER JOIN e LEFT JOIN, que permitem filtrar os resultados da junção entre tabelas. Veja os detalhes de cada um abaixo:
INNER JOIN
SELECT * FROM cliente INNER JOIN compra ON idcliente
Utilizando o INNER JOIN você terá como resultado de sua consulta somente os pares de cliente/compra, ou seja, os casos em que uma compra não está ligada a nenhum cliente ou clientes que não possuem compras, não serão apresentados no resultado.
LEFT JOIN
SELECT * FROM cliente LEFT JOIN compra ON idcliente
O LEFT JOIN traz todos os resultados da tabela mais à esquerda e o agrega ao seu valor correspondente das outras tabelas, caso existam. Ou seja, nesse caso a consulta retornaria todos os clientes e suas compras, caso existam. Caso não existam compras para esses clientes os campos relativos à tabela de compras ficariam em branco.
RIGHT JOIN
SELECT * FROM cliente RIGHT JOIN compra ON idcliente
De forma análoga ao LEFT JOIN, o RIGHT JOIN traz todos os resultados da tabela mais à direita e o agrega ao seu valor correspondente das outras tabelas, caso existam. Ou seja, nesse caso a consulta retornaria todas as compras e, caso existam, seus clientes. Caso não existam clientes para essa compra os campos relativos à tabela de clientes ficariam em branco.
OUTER JOIN
SELECT * FROM cliente OUTER JOIN compra ON idcliente
O comando OUTER JOIN, mesmo não sendo muito conhecido, pode ser bastante útil em alguns casos. Ele traria como resultado todos os clientes que não estão ligados à nenhuma compra.
Espero que seja útil. Caso queira complementar algo ou caso tenha alguma dúvida, deixe seu comentário!
Postado originalmente em Eu Faço Programas.
5 Comentários
Como eu faço o último join no mysql. Atualmente tenho usado not in para isso.
Excelente a sua explicação Gabi, é sempre bom relembrar.
Muito bom Post porém esta sitax somente funcionara em tabelas que tem chaves comuns entre si um exemplo seria na tabela COMPRA o campo IdCliente deve ser uma chave estrangeira da tabela CLIENTE então para quem quer utilizar da junções entre tabelas vai a Sintax.
SELECT
CLI.IdCliente as IDCLIENTE,
COM.Numeropedido,
COM.NomeProduto,
COM.QtdItem
FROM
CLIENTES CLI
INNER JOIN COMPRA COM ON CLI.IdCliente = COM.IdCliente
A grande sacada na hora de realizar consultas é sempre saber qual tabela esta mais a esquerda, se eu fosse pesquisar todas as compras de um cliente então a tabela mais a esquerda seria a de COMPRA um exemplo abaixo:
SELECT
CLIENTE.IdCliente AS [ID CLIENTE],
CLIENTE.NomeCliente AS [NOME CLIENTE],
COMPRA.NumPedido AS [NUM PEDIDO],
COMPRA.DataCompra AS [DATA],
COMPRA.NomeProduto AS [DESCRIÇÃO PRODUTO],
COMPRA.ValorCompra AS [VALOR DA COMPRA]
FROM
COMPRA
LEFT JOIN CLIENTE ON COMPRA.IdCliente = CLIENTE.IdCliente
WHERE
CLIENTE.IdCliente = ‘012213’ AND (COMPRA.DataCompra >=’2011-01-01 AND COMPRA.DataCompra <= GETDATE())
ORDER BY
COMPRA.NumPedido DESC
Este Exemplo acima traz todas as compras realizadas pelo cliente numero '012213' no periodo
de data entre 01/01/2011 até a data atual e orderna todos os registros de modo decrecente
tomando como parametro o numero do pedido.
É boa pratica de programação utilizar Alias alterando o nome real das colunas como COLUNA AS [COLUNA EXEMPLO] assim ajudando a proteger seu banco de Ataques Indesejaveis.
Valeu Pessoal parabens Gabriella pelo seu Otimo Post.
Muito bom o post Gabriela. Como instrutor de Bancos de Dados, eu só gostaria de complementar que é uma boa prática sempre dar um apelido (ou álias) para as tabelas e referenciar as colunas prefixando o nome do apelido, como no exemplo do Adalberto. Quanto menor o apelido, melhor p/ o BD. Os motivos??? Isso eu guardo p/ os meus treinamentos… rsrsrs
[]s
Fábio Prado
http://www.fabioprado.net
Simples e objetiva! melhor explicação de JOIN que já vi meus parabéns!