Uma análise detalhada de SQL JOINs e operações de conjunto
Hoje estou escrevendo sobre JOINs porque, por que não? Também os achei um pouco confusos, pois os estava aprendendo na semana passada. Portanto, este artigo é simplesmente para garantir que eu os acertei e também para referência futura.
No SQL, uma operação de junção combina linhas de duas ou mais tabelas com base em uma coluna relacionada entre elas. Até a semana passada, eu não fazia ideia de que havia semi-junções e anti-junções, apesar de ter feito alguns cursos de SQL.
Aqui está um detalhamento de todas as junções que existem com o melhor de meu conhecimento. As junções são representadas em verde
- INNER JOIN: Retorna apenas as linhas que possuem valores correspondentes em ambas as tabelas. Esta é a junção mais comumente usada.
SELECT *
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT *
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT *
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT *
FROM customers
FULL OUTER JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT *
FROM customers
CROSS JOIN orders;
Número total de linhas = Número total de clientes * Número total de pedidos
Esse tipo de junção pode resultar em conjuntos de resultados muito grandes, portanto, deve ser usado com cautela. Na maioria das vezes, INNER, RIGHT ou LEFT JOIN serão suficientes.
Semi Join e Anti Join
Semi-junção e anti-junção usam uma tabela da direita para determinar quais registros devem ser mantidos na tabela da esquerda. Em outras palavras, você os usa de maneira semelhante a uma cláusula WHERE dependente dos valores de uma segunda tabela.
Semi-joins e anti-joins não têm a mesma sintaxe SQL integrada que INNER JOIN e LEFT JOIN têm.
Anti Junção
Uma antijunção seleciona registros na primeira tabela onde uma condição NÃO É atendida na segunda tabela. A antijunção seleciona as colunas na tabela à esquerda que não correspondem à condição na tabela à direita.
A antijunção é particularmente útil para identificar quais registros estão causando o aparecimento de um número incorreto de registros nas consultas de junção. É muito útil para diagnosticar problemas com outras junções em termos de obtenção de menos ou mais registros do que o esperado.
Como exemplo, usaremos duas tabelas compostas, clientes e pedidos para ilustração.
SELECT *
FROM orders
WHERE customer_id NOT IN (SELECT customer_id FROM customers WHERE country = 'Kenya');
Semi Junção
A semijunção escolhe registros na primeira tabela onde uma condição é atendida em uma segunda tabela. A semijunção corresponde aos registros por campo-chave na tabela da direita com os da esquerda. Em seguida, ele seleciona apenas as linhas na tabela à esquerda que correspondem a essa condição.
Quando quiser filtrar sua primeira tabela com base nas condições definidas em uma segunda tabela, você deve usar uma semijunção para realizar sua tarefa. Se, em vez disso, você quiser filtrar sua primeira tabela com base nas condições NÃO atendidas em uma segunda tabela, deverá usar um anti-join.
SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_id FROM customers WHERE country = 'Kenya');
Estes são exemplos básicos de semi-junção e anti-junção no SQL. O uso específico e até mesmo a sintaxe podem variar, é claro, dependendo do contexto e do banco de dados que está sendo usado.
Definir operações em SQL
No SQL, as operações de conjunto são usadas para combinar os resultados de duas ou mais instruções SELECT em um único conjunto de resultados. Existem vários deles discutidos abaixo.
UNION é uma operação de conjunto que combina os resultados de duas ou mais instruções SELECT. O conjunto de resultados de um UNION contém todas as linhas de cada instrução SELECT, com as linhas duplicadas removidas.
As colunas retornadas por cada instrução SELECT devem ter os mesmos tipos de dados e na mesma ordem. Isso é importante porque será retornado como um único campo. Em outras palavras, você não pode empilhar um número em cima de um campo de caractere. A sintaxe básica para uma união é a seguinte:
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
SELECT column1, column2, ...
FROM table1
UNION ALL
SELECT column1, column2, ...
FROM table2;
No SQL, INTERSECT e EXCEPT também são operações definidas semelhantes a UNION.
INTERSECT retorna apenas as linhas que estão presentes em ambos os conjuntos de resultados de duas ou mais instruções SELECT. As colunas retornadas por cada instrução SELECT devem ter os mesmos tipos de dados e na mesma ordem. A sintaxe básica para um INTERSECT é a seguinte:
SELECT column1, column2, ...
FROM table1
INTERSECT
SELECT column1, column2, ...
FROM table2;
SELECT column1, column2, ...
FROM table1
EXCEPT
SELECT column1, column2, ...
FROM table2;
EXCEPT permite incluir apenas os registros que estão em uma tabela, mas não na outra. EXCEPT está disponível no banco de dados PostgreSQL enquanto MINUS está disponível no MySQL e Oracle.
UNIONtambém pode ser usado para determinar todas as ocorrências de um campo em várias tabelas. INTERSECT procura REGISTROS em comum, não campos-chave individuais como o que um JOIN faz para corresponder. Esta é uma distinção importante.
UNION e UNION ALL não fazem exatamente a mesma coisa que um JOIN faz. Eles apenas vinculam campos um sobre o outro nas duas tabelas. INTERSECT funciona de forma semelhante a UNION e UNION ALL, mas inclui apenas os registros em comum para ambas as tabelas e campos selecionados.
UNION ALLextrairá todos os registros de duas tabelas, enquanto INTERSECTretornará apenas registros que ambas as tabelas tenham em comum. Uma questão como quais países também têm uma cidade com o mesmo nome do nome do país? podem ser respondidas usando INTERSECT.
Resumo
- A semijunção escolhe registros na primeira tabela onde uma condição é atendida em uma segunda tabela.
- Uma antijunção escolhe registros na primeira tabela onde uma condição NÃO É atendida na segunda tabela.
- UNION inclui todos os registros em ambas as tabelas, mas NÃO conta duas vezes aqueles que estão em ambas as tabelas
- UNION ALL replica aqueles que estão em ambas as tabelas.
- INTERSECT fornece apenas os registros encontrados em ambas as duas tabelas.
- EXCETO fornece apenas os registros em uma tabela, MAS NÃO na outra.
Saúde!





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)