curso
Introdução às uniões de SQL
Durante a análise de dados em SQL, muitas vezes você precisará examinar várias tabelas e uni-las para obter os resultados desejados. Unir tabelas para analisar dados também é uma habilidade necessária para um cientista de dados. Neste tutorial, você aprenderá sobre os diferentes tipos de junções que podem ser executadas no PostgreSQL. Primeiro, você estudará os conceitos preliminares de junções no SQL e, em seguida, aprenderá sobre diferentes tipos de junções e quais são suas sintaxes no PostgreSQL. Você concluirá este tutorial executando vários tipos de consultas de união usando duas tabelas. Para poder acompanhar o curso, você deve estar familiarizado com os conceitos básicos de SQL e como escrever consultas simples no PostgreSQL. Se você estiver procurando por recursos para aprender isso, os seguintes podem ser úteis
- Guia do PostgreSQL para iniciantes
- Curso de introdução ao SQL para ciência de dados da DataCamp
Vamos começar.
Configurar o ambiente do banco de dados no PostgreSQL
Antes de você estudar os conceitos básicos das uniões SQL, seria uma boa ideia criar algumas tabelas para suas análises. Você precisará de pelo menos duas tabelas com pelo menos uma coluna em comum. Embora você possa executar consultas self-join na mesma tabela, vamos ignorar esse fato por enquanto.
Você pode executar todas as operações SQL em uma ferramenta chamada pgAdmin
, que geralmente vem com a instalação do PostgreSQL. Vamos abrir o site pgAdmin
e criar um banco de dados (dê a ele um nome de sua escolha) para criar as tabelas se você não tiver um banco de dados existente para prosseguir. Em seguida, você pode criar as duas tabelas a seguir com as especificações fornecidas
- nome_do_aluno (id, nome)
- student_stream (id, stream)
Observe que ambas as tabelas têm a coluna id
em comum. Você pode usar os seguintes comandos do site CREATE
para criar as tabelas -
- Para nome_do_aluno -
CREATE TABLE student_name ( id smallint, name "char"[] );
- Para student_stream -
CREATE TABLE student_stream ( id smallint, stream "char"[] );
Vamos agora inserir alguns registros nas tabelas.
- Para nome_do_aluno -
INSERT INTO student_name(id, name) VALUES (1, 'Sayak');
INSERT INTO student_name(id, name) VALUES (2, 'Alex');
INSERT INTO student_name(id, name) VALUES (3, 'Sameer');
INSERT INTO student_name(id, name) VALUES (4, 'Rick');
- Para student_stream -
INSERT INTO student_stream(id, stream) VALUES (1, 'CS');
INSERT INTO student_stream(id, stream) VALUES (1, 'IT');
INSERT INTO student_stream(id, stream) VALUES (2, 'ECE');
INSERT INTO student_stream(id, stream) VALUES (9, 'ECE');
As entradas da tabela devem ser como as seguintes, caso você tenha executado as consultas acima sem alterar nada -
Agora você tem duas tabelas simples prontas. Vamos agora estudar os conceitos básicos das uniões de SQL.
Junções de SQL - Noções básicas
As junções SQL permitem que você agrupe duas ou mais tabelas (às vezes apenas uma tabela) usando identificadores comuns. Veja o exemplo das duas tabelas acima que você criou - ambas as tabelas têm a coluna id
em comum. Você pode questionar a necessidade de junção no SQL. Vamos discutir isso resumidamente.
Devido às restrições de normalização, você pode não ter todas as informações necessárias em uma única tabela. A normalização não é apenas desejada, mas também necessária para manter a consistência, reduzir a redundância e evitar várias inserções e anomalias de atualização. Considere as duas tabelas acima novamente. Suponha que você queira descobrir os cursos em que Sayak
se inscreveu. Para obter a resposta a essa pergunta, você precisará unir as duas tabelas (subconsultas também podem ser usadas, mas não vamos considerar isso agora) e, em seguida, proceder de acordo.
Para que duas tabelas sejam unidas, é necessário que haja algo em comum entre elas. Isso significa que ambas as tabelas precisam ter pelo menos uma coluna com o mesmo nome? Ou o que exatamente é essa condição?
As tabelas que você deseja unir podem não ter uma coluna com o mesmo nome, mas logicamente devem ser as mesmas, ou seja, seus tipos de dados devem ser os mesmos. Você não pode unir duas tabelas que tenham uma coluna com o mesmo nome, mas com tipos de dados diferentes. Vamos agora estudar os diferentes tipos de junções SQL.
Diferentes tipos de junções SQL
Nesta seção, você estudará vários tipos de junções de SQL -
- INNER JOIN
- Autoadesão
- OUTER JOIN
- LEFT JOIN
- JUNÇÃO DIREITA
- JUNÇÃO COMPLETA
- JUNÇÃO CRUZADA
- Semi-união e Anti-união
O PostgreSQL fornece palavras-chave separadas para os tipos de junções mencionados em letras maiúsculas. Vamos estudar cada uma delas, uma a uma. Para isso, você primeiro estudará as uniões visualmente e, em seguida, executará as respectivas consultas de união no PostgreSQL.
INNER JOIN
Dê uma olhada no diagrama a seguir para entender visualmente o site INNER JOIN
-.
No exemplo acima, a coluna em consideração é a coluna id
. INNER JOIN
ignorará o restante das colunas para as quais os valores não são comuns em ambas as tabelas. Vamos agora executar uma consulta no PostgreSQL que realizaria INNER JOIN
entre as duas tabelas - nome_do_aluno e fluxo_do_aluno.
Ao executar a consulta a seguir, você obtém o resultado apresentado na figura acima.
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
ON s1.id = s2.id;
s1
e s2
são os aliases para as duas tabelas. Você usou a palavra-chave ON
junto com INNER JOIN
. A consulta também pode ser executada usando a palavra-chave USING
- você pode usar a palavra-chave .
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
USING (id);
O Self Join permite que você realize uniões na mesma tabela. Mas onde essa pode ser uma boa opção? Suponha que você tenha uma tabela composta pelas seguintes colunas -
- País
- Continente
Agora você quer alistar dois países de forma que seus continentes sejam os mesmos. A figura a seguir deve dar a você uma ideia dos resultados esperados -
OUTER JOIN
OUTER JOIN
podem ainda ser divididos em três tipos
LEFT JOIN ou Left Outer JOIN: O diagrama a seguir dá a você uma boa ideia de LEFT JOIN
no SQL -
Observe que, diferentemente de INNER JOIN
, LEFT JOIN
busca os registros da tabela da esquerda (de acordo com a ordem que você especificar na consulta) para os quais não havia nenhuma entrada correspondente na tabela da direita. Isso, por sua vez, diz a você que Sameer
e Rick
não se inscreveram em nenhum fluxo. A respectiva consulta para isso será -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
LEFT JOIN student_stream AS s2
ON s1.id = s2.id;
RIGHT JOIN ou Right Outer JOIN : RIGHT JOIN
é exatamente o oposto de LEFT JOIN
-.
RIGHT JOIN
pode ajudar você a encontrar o(s) curso(s) para o(s) qual(is) nenhum aluno se inscreveu. A consulta para isso seria -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
RIGHT JOIN student_stream AS s2
ON s1.id = s2.id;
FULL JOIN ou Full Outer JOIN: FULL JOIN
permite que você combine os sites LEFT JOIN
e RIGHT JOIN
em uma única compilação -
A respectiva consulta seria -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
FULL JOIN student_stream AS s2
ON s1.id = s2.id;
Observe que você pode executar todas as consultas OUTER JOIN
acima usando a palavra-chave USING
. Vamos agora estudar CROSS JOIN
.
JUNÇÃO CRUZADA
CROSS JOIN
é essencialmente o produto cartesiano entre dois elementos expressos usando SQL. Suponha que você precise ter todas as combinações possíveis entre duas tabelas ou até mesmo em uma única tabela. Você precisará do site CROSS JOIN
para fazer isso. A figura a seguir apresenta esse conceito visualmente - você pode ver o que está acontecendo.
Você já tem duas tabelas para testar isso. Para ter todas as combinações possíveis entre as colunas id
das tabelas student_name
e student_stream
, você pode executar a seguinte consulta -
SELECT s1.id, s2.id
FROM student_name AS s1
CROSS JOIN student_stream AS s2;
E você obtém o seguinte resultado -
Vamos ver agora os outros dois tipos de junção para os quais o PostgreSQL não fornece nenhuma palavra-chave direta.
Semi-união e Anti-união
Vamos considerar as tabelas que você criou anteriormente no tutorial:
Semi Join
As consultas geralmente são executadas na forma de subconsultas, em que as linhas são retiradas da primeira tabela em relação a uma condição (ou um conjunto de condições) que é correspondida na segunda tabela. Vamos supor que a tabela da esquerda seja a primeira tabela e a tabela da direita seja a segunda tabela.
Anti Join
As consultas são exatamente o oposto. Em Anti Join
, as linhas são retiradas da primeira tabela com relação a uma condição (ou um conjunto de condições) que não é correspondida na segunda tabela. Aqui está um diagrama para você entender isso visualmente -
A consulta para a realização do Semi Join
seria: - Você pode fazer o download do .
select id, name
from student_name
where id IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));
Da mesma forma, a consulta que realiza Anti Join
, nesse caso, seria -
select id, name
from student_name
where id NOT IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));
Observe o uso de NOT
na consulta acima.
Levando seu conhecimento de SQL Join para o próximo nível
Isso é tudo para este tutorial. Você estudou sobre vários tipos diferentes de junções SQL neste tutorial e também se familiarizou com suas sintaxes no PostgreSQL. Se quiser praticar alguns exercícios desafiadores de junção de SQL, você deve fazer o curso de junção de dados em SQL da DataCamp. Na verdade, os materiais do curso foram usados como referência para criar este tutorial.
Informe-me sobre suas dúvidas na seção Comments
.
Cursos em SQL
curso
Introdução ao SQL
curso