segunda-feira, 20 de janeiro de 2020

COMPREENDENDO INNER JOIN, LEFT JOIN, RIGHT JOIN e FULL OUTER JOIN




O conceito é bem simples, todos nós aprendemos na escola a teoria dos conjuntos, logo a extração de informação com interseção no SQL é simplesmente gerar um subconjunto do conjunto universo.

Digamos que tenhamos duas tabelas, sendo uma de CLIENTE e outra de PEDIDO, conforme a estrutura abaixo:

CLI_CLIENTE
CLI_N_CODIGO
CLI_C_RAZAO
CLI_C_PAIS
1
Acne Ltda
Brasil
2
Limofer Industria
China
4
Kimber Partner S/A
EUA

PED_PEDIDO
PED_C_CODIGO
PED_CLI_N_CODIGO
PED_D_DATA
PED_N_VALOR
100/2019
1
2019-05-01
300,00
101/2019
1
2019-09-12
550,00
102/2019
4
2019-09-24
1000,00
100/2020
5
2020-01-01
600,00

INNER JOIN

Forma clássica de retorno do subconjunto somente com o que é comum na ligação (ON) entre as tabelas.

SELECT CLI_N_CODIGO, CLI_C_RAZAO, PED_C_CODIGO, PED_D_DATA, PED_N_VALOR
       FROM CLI_CLIENTE
              INNER JOIN PED_PEDIDO
                    ON CLI_N_CODIGO = PED_CLI_N_CODIGO

CLI_N_CODIGO
CLI_C_RAZAO
PED_C_CODIGO
PED_D_DATA
PED_N_VALOR
1
Acne Ltda
100/2019
2019-05-01
300,00
1
Acne Ltda
101/2019
2019-09-12
550,00
4
Kimber Partner S/A
102/2019
2019-09-24
1000,00

LEFT E RIGHT JOIN

Retorna somente a partir da tabela que e direção que está sendo usado, no caso do LEFT (a primeira tabela) e RIGHT (a segunda tabela) do JOIN.

SELECT CLI_N_CODIGO, CLI_C_RAZAO, PED_C_CODIGO, PED_D_DATA, PED_N_VALOR
       FROM CLI_CLIENTE
              LEFT JOIN PED_PEDIDO
                    ON CLI_N_CODIGO = PED_CLI_N_CODIGO

CLI_N_CODIGO
CLI_C_RAZAO
PED_C_CODIGO
PED_D_DATA
PED_N_VALOR
1
Acne Ltda
100/2019
2019-05-01
300,00
1
Acne Ltda
101/2019
2019-09-12
550,00
2
Limofer Industria
NULL
NULL
NULL
4
Kimber Partner S/A
102/2019
2019-09-24
1000,00

SELECT CLI_N_CODIGO, CLI_C_RAZAO, PED_C_CODIGO, PED_D_DATA, PED_N_VALOR
       FROM CLI_CLIENTE
              RIGHT JOIN PED_PEDIDO
                    ON CLI_N_CODIGO = PED_CLI_N_CODIGO

CLI_N_CODIGO
CLI_C_RAZAO
PED_C_CODIGO
PED_D_DATA
PED_N_VALOR
1
Acne Ltda
100/2019
2019-05-01
300,00
1
Acne Ltda
101/2019
2019-09-12
550,00
NULL
NULL
100/2020
2020-01-01
600,00
4
Kimber Partner S/A
102/2019
2019-09-24
1000,00

FULL OUTER JOIN

Retorna todo o conjunto relacionando os dados que existem  entre a ligação (ON) e para os casos que não haja ligação carregados os dados nullos.

 SELECT CLI_N_CODIGO, CLI_C_RAZAO, PED_C_CODIGO, PED_D_DATA, PED_N_VALOR
       FROM CLI_CLIENTE
              FULL OUTER JOIN PED_PEDIDO
                    ON CLI_N_CODIGO = PED_CLI_N_CODIGO

CLI_N_CODIGO
CLI_C_RAZAO
PED_C_CODIGO
PED_D_DATA
PED_N_VALOR
1
Acne Ltda
100/2019
2019-05-01
300,00
1
Acne Ltda
101/2019
2019-09-12
550,00
2
Limofer Industria
NULL
NULL
NULL
4
Kimber Partner S/A
102/2019
2019-09-24
1000,00
NULL
NULL
100/2020
2020-01-01
600,00

Segue um infográfico que ajuda no entendimento de cada tipo de ligação.


Marcelo Goberto de Azevedo
Arquiteto na GFT Brasil
https://marcelogoberto.blogspot.com/