Ícone do site dfilitto

Demystificando os SQL JOINs: O Guia Definitivo para Combinar Tabelas

Curso gratuito - Como trabalhar com o Banco de dados MySQL

No mundo real dos bancos de dados, a informação raramente está em um único lugar. Para manter os dados organizados, nós os dividimos em tabelas: uma para Funcionarios, outra para Departamentos.

Mas como fazer uma consulta que mostre o nome do departamento de ‘Ana Silva’, se o nome está em outra tabela?

A resposta é o SQL JOIN.

JOIN é a instrução SQL que usamos para combinar linhas de duas ou mais tabelas com base em uma coluna relacionada entre elas.

A Preparação: Nossa Base Aula_Views

Vamos usar exatamente o mesmo banco de dados que usamos para aprender VIEWs.

SQL

/*
-- Lembrete das nossas tabelas (não precisa executar se já as criou)
USE Aula_Views;

CREATE TABLE Departamentos (
    id_depto INT PRIMARY KEY AUTO_INCREMENT,
    nome_depto VARCHAR(100) NOT NULL
);

CREATE TABLE Funcionarios (
    id_func INT PRIMARY KEY AUTO_INCREMENT,
    nome_func VARCHAR(150) NOT NULL,
    cargo VARCHAR(100),
    salario DECIMAL(10, 2),
    id_depto INT,
    FOREIGN KEY (id_depto) REFERENCES Departamentos(id_depto)
);

-- Lembrete dos nossos dados
INSERT INTO Departamentos (nome_depto) VALUES 
('Engenharia'), ('Recursos Humanos'), ('Marketing'), ('Financeiro');

INSERT INTO Funcionarios (nome_func, cargo, salario, id_depto) VALUES
('Ana Silva', 'Engenheira de Software Sênior', 14000.00, 1),
('Bruno Costa', 'Engenheiro de Software Pleno', 9500.00, 1),
('Carla Mendes', 'Analista de RH', 6000.00, 2),
('Daniel Moreira', 'Gerente de Marketing', 12000.00, 3),
('Elisa Fernandes', 'Analista Financeiro', 5500.00, 4),
('Fábio Guedes', 'Estagiário de Marketing', 1500.00, 3);
*/

IMPORTANTE: Para que os exemplos de LEFT e RIGHT JOIN façam sentido, precisamos de dados que não se correspondem. Vamos adicionar dois registros à nossa base:

  1. Um departamento que não tem nenhum funcionário.
  2. Um funcionário que não está alocado em nenhum departamento.

SQL

-- 1. Adicionando um departamento sem funcionários
INSERT INTO Departamentos (nome_depto) VALUES ('Vendas');

-- 2. Adicionando um funcionário sem departamento
INSERT INTO Funcionarios (nome_func, cargo, salario, id_depto) VALUES
('Gabriel Paiva', 'Analista de RH Jr', 4000.00, NULL);

Agora estamos prontos!

A Cláusula ON: A Regra da Conexão

Antes de ver os tipos de JOIN, entenda a cláusula ON. Ela é a regra que diz ao SQL como as tabelas se conectam.

A sintaxe é: FROM TabelaA JOIN TabelaB ON TabelaA.chave = TabelaB.chave

No nosso caso, a regra será sempre: ON F.id_depto = D.id_depto (Usando F e D como apelidos/aliases para as tabelas Funcionarios e Departamentos).

Os Tipos de JOIN

1. INNER JOIN (A Interseção)

O INNER JOIN é o tipo mais comum. Ele retorna apenas as linhas que têm correspondência em AMBAS as tabelas.

Pense nele como a “interseção”. Se um funcionário não tem departamento (Gabriel Paiva), ele não aparece. Se um departamento não tem funcionário (Vendas), ele também não aparece.

Exemplo: Liste apenas os funcionários que possuem um departamento.

SQL

SELECT
    F.nome_func,
    F.cargo,
    D.nome_depto
FROM
    Funcionarios AS F
INNER JOIN
    Departamentos AS D ON F.id_depto = D.id_depto;

Resultado:

nome_funccargonome_depto
Ana SilvaEngenheira de Software SêniorEngenharia
Bruno CostaEngenheiro de Software PlenoEngenharia
Carla MendesAnalista de RHRecursos Humanos
Daniel MoreiraGerente de MarketingMarketing
Elisa FernandesAnalista FinanceiroFinanceiro
Fábio GuedesEstagiário de MarketingMarketing

2. LEFT JOIN (Tudo da Esquerda)

O LEFT JOIN retorna TODAS as linhas da tabela da “esquerda” (a primeira, Funcionarios) e as linhas correspondentes da tabela da “direita” (Departamentos).

Se não houver correspondência na tabela da direita, o resultado virá com NULL nas colunas da direita.

Exemplo: Liste TODOS os funcionários, e mostre seus departamentos se eles tiverem um.

SQL

SELECT
    F.nome_func,
    F.cargo,
    D.nome_depto
FROM
    Funcionarios AS F
LEFT JOIN
    Departamentos AS D ON F.id_depto = D.id_depto;

Resultado:

nome_funccargonome_depto
Ana SilvaEngenheira de Software SêniorEngenharia
Bruno CostaEngenheiro de Software PlenoEngenharia
Carla MendesAnalista de RHRecursos Humanos
Daniel MoreiraGerente de MarketingMarketing
Elisa FernandesAnalista FinanceiroFinanceiro
Fábio GuedesEstagiário de MarketingMarketing
Gabriel PaivaAnalista de RH JrNULL

3. RIGHT JOIN (Tudo da Direita)

O RIGHT JOIN é o oposto exato do LEFT JOIN. Ele retorna TODAS as linhas da tabela da “direita” (Departamentos) e as linhas correspondentes da tabela da “esquerda” (Funcionarios).

Se não houver correspondência na esquerda, o resultado virá com NULL.

Exemplo: Liste TODOS os departamentos, e mostre quais funcionários eles possuem.

SQL

SELECT
    F.nome_func,
    F.cargo,
    D.nome_depto
FROM
    Funcionarios AS F
RIGHT JOIN
    Departamentos AS D ON F.id_depto = D.id_depto;

Resultado:

nome_funccargonome_depto
Ana SilvaEngenheira de Software SêniorEngenharia
Bruno CostaEngenheiro de Software PlenoEngenharia
Carla MendesAnalista de RHRecursos Humanos
Daniel MoreiraGerente de MarketingMarketing
Elisa FernandesAnalista FinanceiroFinanceiro
Fábio GuedesEstagiário de MarketingMarketing
NULLNULLVendas

Conclusão

JOINs são a espinha dorsal do SQL relacional. Ao usar a mesma base de dados, você pode ver claramente como JOINs e VIEWs trabalham juntos.

Você pode, inclusive, criar uma VIEW que contenha um JOIN (como fizemos no primeiro artigo) para simplificar permanentemente essas consultas.

Sair da versão mobile