Banco de Dados

9 jan, 2018

JOINS em SQL

Publicidade

Motivação

No SQL, o SELECT é utilizado para consultar dados em uma base de dados. Dentro desse comando existe uma palavra reservada, chamada JOIN, o mesmo é utilizado para consultar dados de uma ou mais tabelas, baseado no relacionamento entre colunas destas tabelas. A tradução para português de JOIN é juntar, então quando fomos ver algum SELECT e dentro dele vermos uma palavra JOIN, podemos entender que o mesmo está fazendo uma junção entre algumas tabelas. A cláusula JOIN é usada quando se quer recuperar dados em mais de uma tabela através da igualdade de suas foreign keys. O comando JOIN do SQL tem a função básica de agregar tabelas mediante a um campo que faça sentido às mesmas.

Possíveis tipos de JOINS

Existem vários tipos de JOIN, por exemplo: LEFT JOIN que é o JOIN a esquerda, OUTER JOIN que é JOIN a direita, INNER JOIN usado para selecionar as linhas que possuem equivalência. Para que o SELECT retorne alguma linha é necessário que haja pelo menos um registro em ambas tabelas. Para facilitar o entendimento, vamos utilizar um modelo do Northwind para exemplificar alguns casos: na Figura 1 vemos um exemplo de onde é possível fazer um “INNER JOIN” entre as duas tabelas.

Figura 1. Relação entre duas tabelas.

INNER JOIN

O INNER JOIN geralmente é a maneira mais utilizada de se retornar dados espalhados entre tabelas, funciona seguindo o princípio de que para os registros retornados de uma tabela, deve haver algum tipo de relação com os registros da outra tabela. Ele tem como objetivo aglutinar duas ou mais tabelas mediante à atributos comuns que estão presentes nas mesmas, onde para realizarmos esta junção, utilizamos as chaves primárias/estrangeiras.

Por meio do JOIN, os registros de duas tabelas são usados para que sejam retornados os dados relacionados de ambas. Para especificar o tipo de associação, usamos a cláusula ON seguido do FROM e da condição WHERE. Segue abaixo na Listagem 1, a sintaxe do INNER JOIN:

SELECT '<campos>' FROM '<tabela 1>' 

INNER JOIN '<tabela 2>' ON '<campo tabela 1>' = '<campo tabela 2>'

Listagem 1: Sintaxe do INNER JOIN.

Com base no modelo Northwind da Figura 1, quando queremos juntar duas ou mais tabelas por coincidência, para cada linha da tabela PEDIDO, queremos o ID_CLIENTE correspondente que internamente (INNER), em seus valores de atributos, coincidam. No caso de PEDIDO e CLIENTE, os atributos internos coincidentes são id_cliente na tabela CLIENTE e id_cliente na tabela PEDIDO. Para efetivarmos a junção das duas tabelas, será necessário ligar (ON) as duas tabelas por seus atributos internos (INNER) coincidentes. Para exemplificar melhor, observe o conteúdo das tabelas na Listagem 2 abaixo:

Select c.nome, p.valor as Pedido from Pedido p

inner join Cliente c

on c.id_cliente = p.id_cliente

Listagem 2: Executando o INNER JOIN.

  • Linha 1: Cria um SELECT com os campos que deseje retornar como resultado;
  • Linha 2: Faz a junção entre as tabelas;
  • Linha 3: Condição (Onde o primeiro campo for igual ao segundo);

Na Figura 2 podemos visualizar o resultado dessa consulta no SQL.

Figura 2: Linhas retornadas na consulta do INNER JOIN.

Para ficar mais claro, a Figura 3 ilustra como deve ser o formato comum de JOIN, que retorna dados apenas quando as duas tabelas têm chaves correspondentes na cláusula ON do JOIN.

Figura 3. JOIN entre duas tabelas.

CROSS JOIN

O CROSS JOIN irá relacionar todos os elementos da primeira tabela com todos os elementos da segunda tabela. O CROSS JOIN possui uma funcionalidade completamente diferente dos outros tipos de JOIN. Ele simplesmente obtém todos os registros de todas as tabelas e faz o produto cartesiano (ou seja, cada registro de uma tabela é relacionado com cada registro da outra tabela), obtendo assim, o número total de registros através da multiplicação do total de registros das tabelas envolvidas no CROSS JOIN, na Listagem 3 está a sintaxe do comando CROSS JOIN.

Select <campos> from <tabela 1>

Cross join <tabela 2>

Listagem 3: Sintaxe do comando CROSS JOIN.

Para exemplificar o uso desse comando, iremos selecionar todos os registros da tabela onde o ID_CLIENTE esteja do lado do nome e do valor do pedido conforme mostra a Listagem 4.

Select *from Pedido 

Cross join Cliente id

Listagem 4: Executando o CROSS JOIN.

  • Linha 1: Retorna os campos das tabelas da tabela selecionada;
  • Linha 2: Criando o CROSS JOIN na tabela Pedidos.

Na Figura 4 podemos visualizar o resultado do CROSS JOIN no SQL.

Figura 4: Linhas retornadas na consulta do CROSS JOIN.

OUTER JOIN

É possível também criar um SELECT que retorna todos os dados de uma tabela, mesmo que esse registro esteja em apenas uma tabela, e não em ambas. Para isso, é utilizado o OUTER JOIN e além de podermos retornar os registros das duas tabelas seguindo alguma relação, ainda podemos retornar registros que não entram nesta relação. Geralmente, este tipo de JOIN pode ser utilizado em duas tabelas. Mas nada impede que se utilize em mais de duas tabelas. A Listagem 5 mostra como criar a sintaxe do OUTER JOIN.

Select <campos> from <tabela 1>

Outer Join <tabela 2> on <tabela 1> = <tabela 2>

Listagem 5: Sintaxe do comando “OUTER JOIN”.

Para exemplificar o uso desse comando iremos selecionar todos os registros da tabela conforme mostra a Listagem 6.

SELECT c.nome, p.valor

FROM tbl_pedido as p

Outer JOIN tbl_cliente as c

on c.id_cliente = p.id_cliente

Listagem 6: Executando o “OUTER JOIN”.

  • Linha 1: Retorna os campos das tabelas;
  • Linha 2: Seleciona as tabelas;
  • Linha 3: Criando o JOIN entre as tabelas (fazendo a junção entre ambas);
  • Linha 4: Criando relação entre as tabelas.

Na Figura 5 podemos visualizar o resultado do OUTER JOIN no SQL.

Figura 5: Linhas retornadas na consulta do OUTER JOIN.

Esses foram apenas alguns exemplos práticos de como utilizar esse poderoso comando SQL em nossas funções no SQL. Lembrando que sempre se deve utilizar as boas práticas não somente em suas aplicações, mas também no banco de dados, se tratando das boas práticas de desenvolvimento e qualidade de código (menos é mais, por: Maya).