Tipos de Joins: Padrões ANSI92 (SQL92) e SQL89

Por Eduardo Soares Alves e José Carlos de Castro Júnior Revisado por Marcelo Pivovar - Sulution Architectx,
Postado em Março 2015

  • Banco de Dados Relacional
  • Um banco de dados Relacional usa relações ou tabelas de duas dimensões para armazenar as informações. Por exemplo, é possível armazenar informações sobre todas as vendas de uma empresa. Em um banco de dados Relacional, é possível criar diversas tabelas para armazenar diferentes informações sobre as vendas, como: Cliente que comprou, produtos,  formas de pagamento, etc.

  • Tipos de Joins
  • Em um Banco de Dados Relacional, instruções SQL do tipo DML (Data Manipulation Language) são muito utilizadas - como o próprio nome já diz - para manipulação de dados. Muitas vezes precisamos exibir os dados de várias  tabelas, uma Join é o que precisamos, pois, através desta conseguimos recuperar dados de mais de uma tabela. Neste artigo vamos demonstrar algumas Joins, nos padrões SQL89 e ANSI92 ou SQL92, são elas: Inner Join, Left Join, Right Join, Full Join e Cross Join, sendo as duas primeiras as mais utilizadas em nosso dia-a-dia.

    • INNER JOIN
    • Este tipo de Join deverá ser usado quando o resultado esperado entre duas ou mais tabelas seja por coincidência, ou seja, para cada linha da primeira tabela queremos a(s)  linha(s) da  segunda tabela correspondente(s). Vejamos o exemplo abaixo entre as tabelas EMPLOYEES e DEPARTMENTS.

      • Padrão Tradicional (SQL89):
      • joins-2

      • Padrão ANSI92 (SQL92):

      joins-3

    • LEFT JOIN
    • Este tipo de Join deverá ser usado quando o resultado esperado NÃO seja por coincidência, sendo assim, irá retornar as linhas da primeira tabela mesmo que não haja correspondencia na  segunda tabela. Vejamos esta utilização no exemplo abaixo entre as tabelas EMPLOYEES e DEPARTMENTS.

      • Padrão Tradicional (SQL89):
      • joins-4

      • Padrão ANSI92 (SQL92):

      joins-5

    • RIGHT JOIN
    • Este é outro tipo de Join ondeo resultado esperado NÃO seja por coincidência, mas, neste caso irá retornar as linhas da segunda tabela mesmo que não haja correspondencia na primeira. Vejamos outro exemplo abaixo entre as tabelas EMPLOYEES e DEPARTMENTS.

      • Padrão Tradicional (SQL89):
      • joins-6

      • Padrão ANSI92 (SQL92):

      joins-7

    • FULL JOIN
    • Neste caso juntamos o INNER JOIN com a listagem de todas as outras linhas não associadas, tanto do lado direito RIGHT JOIN quanto do lado esquerdo LEFT JOIN, NÃO sendo possível utilizar filtros nas tabelas (Exemplo 1), mas, caso seja necessário, é preciso executar o select antes na tabela culocando os filtros para depois executar o FULL JOIN (Exemplo 2). Veja o exemplo abaixo:

      • Padrão Tradicional (SQL89):
      • Padrão SQL89 não tem suporte ao FULL JOIN

      • Padrão ANSI92 (SQL92) – Exemplo 1:
      • joins-8

      • Padrão ANSI92 (SQL92) – Exemplo 2:

      joins-9

    • CROSS JOIN

    Deve ser usado quando for necessario juntar duas ou mais tabelas por cruzamento. Para cada linha da tabela EMPLOYEES queremos todos os DEPARTMENTS ou vice-versa. Ele também é chamado de produto cartesiano entre duas tabelas.

    • Padrão Tradicional (SQL89):
    • joins-10

    • Padrão ANSI92 (SQL92):

    joins-11

  • Conclusão

Após vários testes em ambientes corporativos de grande porte, não identifiquei diferença no que se refere a performance entre os padrões, porém, no quesito manutenção e legibilidade do código, o padrão SQL92 é de longe o melhor, pois, em Queries extensas  (com várias entidades e condições) as Joins entre as tabelas são visualizadas de forma mais rápida.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.