Funcionários e gerentes
Um exemplo clássico de hierarquia.
Funcionários e gerentes é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
O que é uma junção da tabela consigo mesma
Uma junção da tabela consigo mesma ocorre quando uma tabela é associada a si mesma. Isso pode parecer incomum, mas é extremamente útil quando as linhas de uma tabela têm uma relação com outras linhas da mesma tabela.
O exemplo clássico é uma tabela de funcionários na qual cada funcionário pode ter um gerente — e esse gerente também é um funcionário armazenado na mesma tabela.
A tabela de funcionários
Vamos criar uma tabela simples employees. Cada funcionário tem um id, um name e um manager_id que aponta para outra linha da mesma tabela.
Quando manager_id é NULL, o funcionário não tem gerente — está no topo da hierarquia (por exemplo, o CEO).
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
manager_id INT REFERENCES employees(id)
);Inserindo dados de exemplo
Vamos preencher a tabela com uma pequena hierarquia empresarial. Alice é a CEO (não tem gerente). Bob e Carol se reportam a Alice. Dave e Eve se reportam a Bob.
INSERT INTO employees (id, name, manager_id) VALUES
(1, 'Alice', NULL),
(2, 'Bob', 1),
(3, 'Carol', 1),
(4, 'Dave', 2),
(5, 'Eve', 2),
(6, 'Frank', 3);Consultando sem uma junção
Se simplesmente selecionarmos todas as linhas, veremos os números brutos de manager_id — não os nomes dos gerentes. Isso é difícil de ler e não é útil para os usuários finais.
SELECT id, name, manager_id
FROM employees;Escrevendo a junção da tabela consigo mesma
Para exibir o nome do gerente ao lado de cada funcionário, associamos a tabela employees a si mesma. Atribuímos um nome alternativo diferente a cada cópia: e para o funcionário e m para o gerente.
A condição da junção conecta o manager_id do funcionário ao id do gerente.
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;Incluindo funcionários sem gerente
A INNER JOIN acima oculta Alice porque o manager_id dela é NULL — não há uma linha correspondente no lado direito. Para incluir todos (até mesmo o funcionário no topo da hierarquia), use uma LEFT JOIN.
Alice aparecerá com NULL na coluna do gerente.
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;Usando COALESCE para facilitar a leitura
NULL na coluna do gerente pode causar confusão. Podemos usar COALESCE para substituir NULL por um rótulo legível, como 'Sem gerente', deixando o resultado mais claro para relatórios.
SELECT
e.name AS employee,
COALESCE(m.name, 'No Manager') AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
ORDER BY manager, employee;Encontrando subordinados diretos
Podemos inverter a consulta para perguntar: quem se reporta a um gerente específico? Isso é chamado de encontrar subordinados diretos. Aqui, encontramos todos os funcionários que se reportam diretamente a Alice (ID = 1).
SELECT e.name AS direct_report
FROM employees e
WHERE e.manager_id = 1;Contando subordinados por gerente
Combinar uma junção da tabela consigo mesma com GROUP BY e COUNT permite ver quantos subordinados diretos cada gerente tem. Isso é útil para analisar a carga de trabalho.
SELECT
m.name AS manager,
COUNT(e.id) AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.name
ORDER BY direct_reports DESC;Dois níveis de profundidade
Para ver dois níveis da hierarquia ao mesmo tempo — o funcionário, seu gerente e o gerente do seu gerente — podemos associar a tabela uma terceira vez. Cada junção adiciona outro nível à hierarquia.
SELECT
e.name AS employee,
m.name AS manager,
gm.name AS grand_manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
LEFT JOIN employees gm ON m.manager_id = gm.id;Quando as junções da tabela consigo mesma têm limitações
As junções da tabela consigo mesma funcionam bem para hierarquias fixas e rasas (de 1 a 3 níveis). Se a profundidade for desconhecida ou ilimitada — como em um organograma empresarial que pode ter 10 níveis — você precisará de CTE recursivas.
Para a maioria das consultas práticas sobre funcionários e gerentes, a abordagem de junção da tabela consigo mesma apresentada nesta lição é a ferramenta adequada.
Verificação rápida
Teste sua compreensão das junções da tabela consigo mesma e da hierarquia de funcionários e gerentes.
Recapitulação da lição
Nesta lição, você aprendeu a usar uma junção da tabela consigo mesma para modelar e consultar uma hierarquia clássica de funcionários e gerentes armazenada em uma única tabela.
Principais pontos:
- Uma junção da tabela consigo mesma associa uma tabela a si mesma usando dois nomes alternativos diferentes.
- A condição da junção conecta
manager_idaidna mesma tabela. - Use INNER JOIN para ver apenas os funcionários que têm um gerente e LEFT JOIN para incluir todos.
- COALESCE pode substituir valores NULL do gerente por um rótulo legível.
- Para hierarquias de profundidade ilimitada, considere usar CTE recursivas.
Perguntas Frequentes
A aula “Funcionários e gerentes” é grátis?
Sim — o texto completo de “Funcionários e gerentes” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Funcionários e gerentes”?
Um exemplo clássico de hierarquia. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Funcionários e gerentes”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- O que é uma autojunção
- Funcionários e gerentes
- Comparando linhas na mesma tabela
- Limitações das autojunções