0Pricing
SQL Interview Prep · Aula

SELF JOIN para hierarquias

Una uma tabela a si mesma para modelar relações funcionário-gerente e pai-filho.

SELF JOIN para hierarquias é uma aula grátis de SQL Interview Prep 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 Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.

O que uma SELF JOIN realmente é

Uma SELF JOIN é simplesmente uma operação de junção em que uma tabela aparece nos dois lados. Não existe uma palavra-chave especial SELF JOIN; você escreve uma INNER ou LEFT JOIN normal e faz referência à mesma tabela duas vezes.

O recurso que faz isso funcionar são os apelidos de tabela. Você dá um apelido diferente a cada cópia para que o mecanismo as trate como duas tabelas independentes.

SELECT e.name, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Por que os apelidos são obrigatórios

Sem apelidos distintos, a consulta fica ambígua: cada nome de coluna aparece duas vezes e o mecanismo não consegue determinar qual cópia você quer dizer. Atribuir um apelido a cada instância resolve isso.

Leia a junção como 'associe cada linha de funcionário à linha do funcionário que é seu gerente.' O apelido e representa o funcionário, m representa o gerente, e ambos vêm da mesma tabela física.

-- e = the employee, m = that employee's manager
SELECT e.id, e.name, m.name AS reports_to
FROM employees AS e
JOIN employees AS m ON e.manager_id = m.id;

Modelo funcionário-gerente

O cenário clássico de SELF JOIN é uma lista de adjacência: uma única tabela armazena linhas, e cada linha aponta para seu elemento pai por meio de uma chave estrangeira para a mesma tabela.

Uma tabela employees com um manager_id que faz referência a employees.id modela um organograma inteiro em uma única tabela. Cada gerente é apenas outra linha de funcionário.

-- One table holds the whole hierarchy
-- employees(id, name, manager_id)
-- manager_id -> employees.id

Listando todos com seu gerente

A pergunta mais comum sobre SELF JOIN: mostre cada funcionário ao lado do nome de seu gerente. Faça a junção da cópia dos funcionários com a cópia dos gerentes usando e.manager_id = m.id.

Isso retorna uma linha por funcionário cujo gerente existe. Observe que o topo do organograma, o CEO, tem um NULL em manager_id e será excluído por uma junção interna.

SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Usando LEFT JOIN para manter o topo da árvore

Para incluir o CEO (cujo manager_id é NULL), mude para uma LEFT JOIN. O lado dos funcionários é preservado; as colunas do gerente retornam NULL para as linhas sem pai.

Os entrevistadores usam isso para avaliar se você se lembra de que uma SELF JOIN interna elimina os nós raiz. A correção é a mesma que em qualquer situação de junção externa de 'manter linhas sem correspondência'.

SELECT e.name AS employee,
       COALESCE(m.name, '(top level)') AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

Contando subordinados diretos por gerente

Uma pergunta comum de acompanhamento: quantas pessoas se reportam diretamente a cada gerente? Faça uma operação SELF JOIN e depois agrupe pelo gerente.

Fazemos a junção entre funcionários e gerentes, agrupamos pela identidade do gerente e contamos os funcionários. Isso conta apenas subordinados diretos, não toda a subárvore abaixo deles.

SELECT m.name AS manager, COUNT(*) AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.id, m.name
ORDER BY direct_reports DESC;

Avançando dois níveis

Para obter um funcionário, seu gerente e o gerente de seu gerente, encadeie três cópias da tabela. Cada nível exige outra operação SELF JOIN.

Isso funciona para uma profundidade fixa e conhecida. Se precisar de profundidade arbitrária, uma SELF JOIN não basta; esse é o sinal para usar uma CTE recursiva, que os entrevistadores esperam que você mencione.

SELECT e.name AS employee,
       m.name AS manager,
       g.name AS grand_manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
LEFT JOIN employees g ON m.manager_id = g.id;

SELF JOIN versus CTE recursiva

Distinção principal que os entrevistadores avaliam:

  • Uma SELF JOIN lida com um número fixo de níveis. Três cópias equivalem a três níveis, não mais.
  • Uma CTE recursiva lida com profundidade ilimitada, fazendo repetidamente a junção da tabela consigo mesma até que nenhuma linha nova apareça.

Portanto, 'mostrar cada funcionário e seu gerente direto' exige uma SELF JOIN, mas 'listar todos os ancestrais ao longo da cadeia' exige recursão.

Categorias pai-filho

O mesmo padrão modela qualquer árvore: categorias de produtos, discussões em comentários e regiões geográficas. Uma tabela categories com parent_id referenciando seu próprio id tem estrutura idêntica à do caso funcionário-gerente.

Reconhecer que 'uma tabela com uma chave estrangeira que referencia a si mesma' equivale a 'SELF JOIN ou recursão' é o aprendizado reutilizável.

SELECT c.name AS category,
       p.name AS parent_category
FROM categories c
LEFT JOIN categories p ON c.parent_id = p.id;

Erros comuns em operações SELF JOIN

Fique atento a estes pontos em entrevistas:

  • Esquecer os apelidos, causando erros de coluna ambígua.
  • Usar INNER JOIN e eliminar silenciosamente linhas raiz (pai NULL).
  • Fazer a junção na direção errada: e.id = m.manager_id em vez de e.manager_id = m.id.

Antes de escrever o ON, sempre declare em voz alta qual apelido é o filho e qual é o pai.

Quando usar SELF JOIN

Recorra a uma operação SELF JOIN sempre que uma tabela relacionar linhas a outras linhas da mesma tabela:

  • Hierarquias com um nível fixo de consulta (funcionário para gerente).
  • Combinação ou comparação de linhas de uma tabela (abordada na próxima lição).

Se a relação for recursiva e sem limite, mencione uma CTE recursiva como ferramenta mais adequada. Essa nuance diferencia iniciantes de profissionais de nível intermediário.

Verificação rápida

Teste sua compreensão de SELF JOINs em hierarquias.

Recapitulação: SELF JOIN para hierarquias

Principais conclusões:

  • Uma operação SELF JOIN é uma junção normal com a mesma tabela nos dois lados, diferenciada por apelidos.
  • Uma lista de adjacência (chave estrangeira que referencia a si mesma, como manager_id) modela uma árvore em uma tabela.
  • Use INNER JOIN para pares correspondentes; LEFT JOIN para manter linhas raiz com pais NULL.
  • As operações SELF JOIN lidam com uma profundidade fixa; a navegação sem limite exige uma CTE recursiva.

Perguntas Frequentes

A aula “SELF JOIN para hierarquias” é grátis?

Sim — o texto completo de “SELF JOIN para hierarquias” é 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 Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.

O que vou aprender em “SELF JOIN para hierarquias”?

Una uma tabela a si mesma para modelar relações funcionário-gerente e pai-filho. Você pratica SQL Interview Prep 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 Interview Prep?

Nenhuma experiência prévia é necessária. SQL Interview Prep 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 “SELF JOIN para hierarquias”?

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 Interview Prep?

Sim. Cada aula de SQL Interview Prep 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

  1. CROSS JOIN e produtos cartesianos
  2. SELF JOIN para hierarquias
  3. Comparando linhas dentro de uma tabela
  4. Escolhendo o tipo correto de junção
← Voltar para SQL Interview Prep