O SQL JOIN é um dos comandos que mais geram dúvidas entre pessoas desenvolvedoras. Afinal, ele apresenta diferentes tipos, cada qual para uma situação, e é usado para combinar dados de consultas complexas.
Por isso, utilizar o tipo de JOIN inadequado para um query, por exemplo, além de resultar em um retorno diferente do esperado, pode gerar até problemas de performance no banco.
No entanto, ao entender como cada JOIN funciona e para que eles servem, um universo de possibilidades se abre. Para ajudar você nesse caminho, neste post vamos mostrar:
- O que é o comando SQL JOIN?
- Criando a tabela e inserindo os dados
- Quais os tipos de SQL JOIN?
- Boas práticas ao usar o comando SQL JOIN
Boa leitura!
O que é o comando SQL JOIN?
O JOIN é uma cláusula muito importante da linguagem SQL cuja função é combinar linhas de diferentes tabelas de acordo com as relações existentes entre as colunas dessas tabelas.
Basicamente o JOIN é usado em diferentes métodos de junção que são baseados na Teoria dos Conjuntos. Ao todo, a linguagem SQL padrão define cinco tipos diferentes de cláusula JOIN. São elas:
- INNER JOIN;
- RIGHT JOIN;
- LEFT JOIN;
- FULL JOIN;
- CROSS JOIN.
Assim, cada uma delas é usada para retornar um conjunto específico de dados. Mais adiante, mostramos em detalhes o uso de cada JOIN.
Criando a tabela e inserindo os dados
Para mostrar o funcionamento e o retorno de cada JOIN vamos precisar de exemplos práticos, certo? Então, vamos criar algumas tabelas simples para fazer nossos testes. No entanto, para simplificar a demonstração, não vamos nos ater a questões de modelagem no momento, já que o objetivo é explicar o uso correto da cláusula JOIN em suas diferentes formas.
As tabelas que vamos criar se chamam, respectivamente, “estudantes” e “professores”. Em ambas, teremos uma coluna “nome”, na qual serão inseridos dados em comum, pois é isso que nos permitirá testar os comandos.
Abaixo, mostramos o código usado para criar a estrutura das tabelas e pupulá-las com os dados do nosso teste.
Quais os tipos de SQL JOINS?
Nosso ambiente de testes já foi preparado, então podemos seguir para a explicação de cada JOIN. Confira!
INNER JOIN
Entre os métodos de junção, o INNER JOIN é um dos mais conhecidos e tem a função de retornar os valores em comum de ambas as tabelas. Na ilustração abaixo, é possível ver a representação desse retorno de forma gráfica. Observe:
Sintaxe
Neste primeiro exemplo, vamos usar o INNER JOIN para consultar o id e o nome dos registros das tabelas “estudantes” e “professores” que têm dados equivalentes na coluna “nome”.
Observe que, na sintaxe abaixo, acrescentamos um “e.” e um “p.” antes do nome das colunas da tabela e que, nas linhas seguinte,s usamos as expressões “estudantes AS e” e “professores AS p”. Isso é uma forma de definir uma espécie de “pseudônimo” para as tabelas. Dessa forma elas podem ser diferenciadas durante a execução.
Já na última linha, usamos a expressão ON para indicar qual coluna das tabelas deve ter seus dados comparados.
SELECT e.id, e.nome, p.id, p.nome
FROM estudantes AS e
INNER JOIN professores AS p
ON e.nome = p.nome;
Figura 4. Demonstração do resultado de um INNER JOIN
LEFT JOIN
O LEFT JOIN é usado para retornar todos os registros da tabela esquerda, além dos registros da tabela à direita que têm valores em comum com a tabela esquerda. Veja a ilustração a seguir para entender melhor:
Figura 5. Retorno do LEFT JOIN
Sintaxe
Observe que o código a seguir é bastante parecido com o do exemplo anterior. No entanto, como queremos apenas os dados da tabela esquerda mais os registros em comum da tabela direita, utilizamos o operador LEFT JOIN.
SELECT e.nome, p.nome
FROM estudantes AS e
LEFT JOIN professores AS p
ON e.nome = p.nome;
LEFT EXCLUDING JOIN
Já com o LEFT EXCLUDING JOIN é possível retornar todos os dados da tabela esquerda que não têm valores correspondentes na tabela da direita. Na imagem mostrada abaixo, vemos uma representação desse tipo de resultado.
Sintaxe
Prosseguindo com nossa demonstração, repare que agora acrescentamos a cláusula WHERE no fim do comando. Dessa forma, definimos um filtro para excluir do retorno os dados em comum entre as tabelas.
SELECT e.nome, p.nome
FROM estudantes AS e
LEFT JOIN professores AS p
ON e.nome = p.nome
WHERE p.nome IS NULL;
Figura 8. Demonstração do resultado de um LEFT EXCLUDING JOIN
RIGHT JOIN
Ao usar o RIGHT JOIN, podemos retornar todos os valores da tabela direita juntamente com os registros em comum na tabela esquerda. A seguir, observe o exemplo gráfico desse retorno:
Sintaxe
Dessa vez, como queremos retornar os dados da coluna “nome” na tabela direita mais os registros com valores repetidos na tabela esquerda, usamos o operador RIGHT JOIN no código.
SELECT e.nome, p.nome
FROM estudantes AS e
RIGHT JOIN professores AS p
ON e.nome = p.nome;
RIGHT EXCLUDING JOIN
Como é mostrado na figura abaixo, o RIGHT EXCLUDING JOIN é responsável por retornar os dados da tabela da direita que não têm valores iguais na tabela esquerda.
Sintaxe
Novamente, para excluir os dados com valores em comum do retorno, usamos um filtro na cláusula WHERE. Porém, dessa vez os dados serão filtrados na tabela “estudantes”.
SELECT e.nome, p.nome
FROM estudantes AS e
RIGHT JOIN professores AS p
ON e.nome = p.nome
WHERE e.nome IS NULL;
FULL JOIN
O FULL JOIN, também conhecido como FULL OUTER JOIN, retorna todos os dados de ambas as tabelas quando há uma relação entre elas. Na imagem abaixo, é possível ver de forma gráfica o retorno desse comando:
Sintaxe
Na sintaxe abaixo, observe que agora usamos o comando FULL OUTER JOIN para retornar todos os dados da coluna “nome” comparando a igualdade dos valores desse campo de ambas as tabelas.
SELECT e.nome, p.nome
FROM estudantes AS e
FULL OUTER JOIN professores AS p
ON e.nome = p.nome;
FULL EXCLUDING JOIN
Com o FULL EXCLUDING JOIN podemos retornar todos os registros que não têm valores repetidos entre as tabelas. Ou seja, ele exclui do retorno todos os dados duplicados, como é possível ver na figura abaixo:
Sintaxe
Agora, perceba que acrescentamos no código um filtro com múltiplas condições usando o operador OR na cláusula WHERE. Dessa forma, conseguimos excluir os nomes em comum entre as tabelas, retornando apenas os dados que não se repetem.
SELECT e.nome, p.nome
FROM estudantes AS e
FULL OUTER JOIN professores AS p
ON e.nome = p.nome
WHERE e.nome IS NULL OR p.nome IS NULL;
CROSS JOIN
Com o comando SQL CROSS JOIN é possível fazer um produto cartesiano entre as tabelas. Isso significa que para cada linha da tabela esquerda ele vai retornar todas as linhas da tabela direita, ou vice-versa. Para facilitar o entendimento, observe o exemplo gráfico desse tipo de retorno abaixo:
Sintaxe
Neste último exemplo, vamos fazer o produto cartesiano entre os campos “nome” e “idade” das tabelas “estudantes” e “professores”. Contudo, para limitar o tamanho do retorno, vamos definir um filtro para consultar apenas os registros com id igual a 1 em ambas as tabelas.
SELECT e.idade, e.nome, p.idade, p.nome
FROM estudantes AS e
CROSS JOIN professores AS p
WHERE e.id = 1 OR p.id = 1;
Boas práticas ao usar o comando SQL JOIN
Apesar de ser um comando muito importante para quem trabalha com bancos de dados SQL, o JOIN também é um dos que mais causa dificuldade entre pessoas desenvolvedoras iniciantes. Um dos motivos é a falta de conhecimento acerca do relacionamento entre tabelas.
Antes de criar uma consulta utilizando as cláusulas JOIN, é preciso entender como a modelagem do banco foi feita para se ter uma boa noção de como suas tabelas se relacionam, identificando as dependências entre elas.
Compreender como esses relacionamentos funcionam é o que nos permite identificar qual dos tipos de JOIN é mais indicado para uma determinada consulta de acordo com os dados que queremos obter.
Ao longo desse conteúdo foi possível notar o quanto o comando SQL JOIN é versátil. Afinal, com suas variações podemos criar consultas mais complexas e combinar dados de diversas formas sem precisar gastar uma enorme quantidade de código.
Gostou do conteúdo e quer aprender mais sobre a área de Banco de Dados? Então confira o próximo artigo e descubra o que faz um profissional de DBA!