Utilizando INNER e LEFT JOIN

Boa tarde a todos,

Este tutorial tem como objetivo de explicar o uso dos comandos INNER JOIN e LEFT JOIN em comandos SQL. Por se tratar de um comando nativo da linguagem SQL, o modo de utilizar é o mesmo de um banco para o outro, ou pelo menos na maioria dos SGDB conhecidos atualmente. Levamos em conta este script de duas tabelas de um banco de dados (neste exemplo é para o MySQL).

[sql]
create table categoria_produto
(
id_categoria_produto integer not null PRIMARY key AUTO_INCREMENT,
descricao varchar(200) not null
);

create table produto
(
id_produto integer not null PRIMARY key AUTO_INCREMENT,
descricao varchar(200) not null,
id_categoria_produto integer not null references categoria_produto(id_categoria_produto)
);
[/sql]

Neste esquema todo produto deve estar ligado diretamente a uma categoria e uma categoria pode estar em vários produtos, até este ponto tudo bem, tudo bem simples, porque o nosso tutorial se baseia nos comandos de JOIN utilizados em SELECT´s.

O comando INNER JOIN

Este comando se baseia em fazer a ligação de uma tabela com a outra onde é necessário que haja a ligação das duas pontas para que um resultado seja retornado, no nosso exemplo que uma categoria tenha um produto ou um produto tenha uma categoria.
Exemplo de uso segundo as tabelas do exemplo deste artigo:

[sql]
# Exemplo com o comando INNER JOIN
select
p.descricao descricao_produto,
cp.descricao descricao_categoria
from
produto p
inner join categoria_produto cp on (cp.id_categoria_produto = p.id_categoria_produto)
order by
p.descricao;
# O mesmo comando fazendo a respectiva ligação pelo comando WHERE
select
p.descricao descricao_produto,
cp.descricao descricao_categoria
from
produto p,
categoria_produto cp
where
cp.id_categoria_produto = p.id_categoria_produto
order by
p.descricao;

[/sql]

Vantagens

  • Quando usado, as ligações entre as tabelas são baseadas nos índices do banco, estes são criados geralmente junto com as ligações de foreign keys das tabelas ou senão criados pelo desenvolvedor para agilizar buscas no banco de dados;
  • É muito mais rápido do que utilizar o comando LEFT para fazer a mesma ligação.

Desvantagens

  • As vezes é necessário fazer mais ligações na cláusula WHERE da SELECT porque a sua ligação no limitador ON não supre todos os requisitos.

O comando LEFT JOIN

A ligação de tabelas utilizando LEFT é para casos em que não é necessário que haja uma ligação direta das tabelas da instrução SQL, ou seja, um produto não precisa ter uma categoria e nem uma categoria precisa ter um produto. Nos casos em que é utilizado o LEFT para ligar, quando ocorre de um registro não ligar com a outra tabela, o registro “faltante” apenas é retornado como NULO.

Exemplo de uso segundo as tabelas do nosso exemplo:

[sql]
# O comando LEFT JOIN fazendo a ligação entre as tabelas.
select
p.descricao descricao_produto,
cp.descricao descricao_categoria
from
produto p
left join categoria_produto cp on (cp.id_categoria_produto = p.id_categoria_produto)
order by
p.descricao;
[/sql]

Vantagens

  • Poucas, apenas as vezes pouca o tempo para não escrever uma query unida, ou seja, que utiliza o comando UNION para trazer os mesmos registros.

Desvantagens

  • As vezes é necessário fazer mais ligações na cláusula WHERE da SELECT porque a sua ligação no limitador ON não supre todos os requisitos;
  • Uma ligação com LEFT faz FULL na tabela alvo, no caso de categoria para produto, seria feito um FULL em todos os registros da tabela produto;
  • Não utiliza indices para ligar as tabelas mencionadas na instrução.

Dica útil

O uso do comando LEFT JOIN não é muito aconselhável por causa da perca de performance em tabelas com muitos registros, um exemplo de “fugir” dele é através da união de queries com o comando UNION.

[sql]
select
p.descricao descricao_produto,
null descricao_categoria
from
produto p
where
p.id_categoria_produto is NULL
union
select
p.descricao descricao_produto,
cp.descricao descricao_categoria
from
produto p,
categoria_produto cp
where
cp.id_categoria_produto = p.id_categoria_produto
order by # Ordena pelo 1° campo da instrução SQL
1;
[/sql]

Abraços e até a próxima.