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:
- Um departamento que não tem nenhum funcionário.
- 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_func | cargo | nome_depto |
| Ana Silva | Engenheira de Software Sênior | Engenharia |
| Bruno Costa | Engenheiro de Software Pleno | Engenharia |
| Carla Mendes | Analista de RH | Recursos Humanos |
| Daniel Moreira | Gerente de Marketing | Marketing |
| Elisa Fernandes | Analista Financeiro | Financeiro |
| Fábio Guedes | Estagiário de Marketing | Marketing |
- Nota:
Gabriel Paiva(que temid_depto = NULL) ficou de fora. - Nota: O departamento
Vendas(que não tem funcionários) também ficou de fora.
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_func | cargo | nome_depto |
| Ana Silva | Engenheira de Software Sênior | Engenharia |
| Bruno Costa | Engenheiro de Software Pleno | Engenharia |
| Carla Mendes | Analista de RH | Recursos Humanos |
| Daniel Moreira | Gerente de Marketing | Marketing |
| Elisa Fernandes | Analista Financeiro | Financeiro |
| Fábio Guedes | Estagiário de Marketing | Marketing |
| Gabriel Paiva | Analista de RH Jr | NULL |
- Nota:
Gabriel Paivaagora está na lista, pois oLEFT JOINforça que todos os funcionários (tabela da esquerda) apareçam.
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_func | cargo | nome_depto |
| Ana Silva | Engenheira de Software Sênior | Engenharia |
| Bruno Costa | Engenheiro de Software Pleno | Engenharia |
| Carla Mendes | Analista de RH | Recursos Humanos |
| Daniel Moreira | Gerente de Marketing | Marketing |
| Elisa Fernandes | Analista Financeiro | Financeiro |
| Fábio Guedes | Estagiário de Marketing | Marketing |
| NULL | NULL | Vendas |
- Nota: O departamento
Vendas, que não tem funcionários, agora aparece na lista, pois oRIGHT JOINforça que todos os departamentos (tabela da direita) apareçam.
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.
INNER JOIN: Traz apenas os dados que se correspondem 100%.LEFT JOIN: Traz TUDO da tabela da esquerda (ex: todos osFuncionarios), mesmo os sem par.RIGHT JOIN: Traz TUDO da tabela da direita (ex: todos osDepartamentos), mesmo os sem par.
Você pode, inclusive, criar uma VIEW que contenha um JOIN (como fizemos no primeiro artigo) para simplificar permanentemente essas consultas.



Add Comment