0Pricing
SQL Academy · Aula

Comparando linhas na mesma tabela

Encontre pares e relacionamentos.

Comparando linhas na mesma tabela é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 3 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 você associa uma tabela a si mesma. Isso pode parecer incomum no início, mas é uma técnica poderosa para comparar linhas dentro da mesma tabela.

Imagine uma tabela employees na qual cada funcionário tem um manager_id que aponta para outra linha da mesma tabela. Uma junção da tabela consigo mesma permite associar cada funcionário ao seu gerente em uma única consulta.

Configurando a tabela de exemplo

Vamos criar uma tabela simples employees para usar ao longo desta lição. Cada linha tem um id, um name, um salary e um manager_id que faz referência a outro funcionário na mesma tabela.

CREATE TABLE employees (
  id         INT PRIMARY KEY,
  name       VARCHAR(50),
  salary     INT,
  manager_id INT
);

INSERT INTO employees VALUES
  (1, 'Alice',   90000, NULL),
  (2, 'Bob',     70000, 1),
  (3, 'Carol',   65000, 1),
  (4, 'Dave',    55000, 2),
  (5, 'Eve',     60000, 2),
  (6, 'Frank',   48000, 3);

Sintaxe básica da junção da tabela consigo mesma

Para associar uma tabela a si mesma, faça referência à mesma tabela duas vezes usando dois nomes alternativos diferentes. Os nomes alternativos funcionam como se houvesse duas cópias separadas da tabela. Em seguida, especifique a condição da junção que conecta as duas cópias.

Aqui, usamos e como nome alternativo de employees (o funcionário) e m (o gerente), fazendo a correspondência com e.manager_id = m.id.

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

Incluindo linhas do topo com LEFT JOIN

Uma INNER JOIN comum descarta as linhas em que manager_id é NULL, o que significa que o funcionário no topo da hierarquia (Alice, a CEO) seria excluído dos resultados.

Use uma LEFT JOIN para que todos os funcionários apareçam, inclusive aqueles sem gerente. A coluna do gerente simplesmente terá NULL para eles.

SELECT
  e.name          AS employee,
  m.name          AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
ORDER BY m.name NULLS LAST, e.name;

Encontrando pares que compartilham uma propriedade

As junções da tabela consigo mesma também são úteis para encontrar pares de linhas que compartilham um valor. Por exemplo, você pode encontrar todos os pares de funcionários que se reportam ao mesmo gerente.

A condição a.id < b.id impede que pares duplicados, como (Bob, Carol) e (Carol, Bob), apareçam nos resultados.

SELECT
  a.name       AS employee_1,
  b.name       AS employee_2,
  a.manager_id AS shared_manager
FROM employees a
JOIN employees b
  ON a.manager_id = b.manager_id
 AND a.id < b.id;

Comparando salários entre linhas

Você pode usar uma junção da tabela consigo mesma para comparar valores numéricos entre linhas. A consulta abaixo encontra todos os funcionários cujo salário é maior que o salário do próprio gerente — uma verificação analítica clássica.

SELECT
  e.name       AS employee,
  e.salary     AS emp_salary,
  m.name       AS manager,
  m.salary     AS mgr_salary
FROM employees e
JOIN employees m ON e.manager_id = m.id
WHERE e.salary > m.salary;

Encontrando linhas sem correspondência

Uma junção da tabela consigo mesma com uma LEFT JOIN e uma verificação WHERE ... IS NULL permite encontrar linhas que não têm uma linha correspondente. Aqui, encontramos funcionários que não têm ninguém se reportando a eles — os nós folha da hierarquia.

SELECT e.name AS employee
FROM employees e
LEFT JOIN employees sub ON sub.manager_id = e.id
WHERE sub.id IS NULL
ORDER BY e.name;

Contando subordinados diretos

Ao associar a tabela a si mesma e agrupar pelo lado do gerente, você pode contar quantos subordinados diretos cada gerente tem. Os funcionários sem subordinados são incluídos por meio de LEFT JOIN.

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

Usando CTE para esclarecer junções da tabela consigo mesma

Quando uma consulta com uma junção da tabela consigo mesma se torna complexa, envolvê-la em uma Expressão de Tabela Comum (CTE) facilita a leitura da lógica. Defina uma CTE para a hierarquia e, em seguida, consulte-a com clareza.

WITH hierarchy AS (
  SELECT
    e.id         AS emp_id,
    e.name       AS employee,
    e.salary     AS emp_salary,
    m.name       AS manager,
    m.salary     AS mgr_salary
  FROM employees e
  LEFT JOIN employees m ON e.manager_id = m.id
)
SELECT *
FROM hierarchy
WHERE mgr_salary IS NOT NULL
  AND emp_salary > mgr_salary;

Junção da tabela consigo mesma em uma tabela não hierárquica

As junções da tabela consigo mesma não se limitam a hierarquias de gerentes e funcionários. O exemplo abaixo usa uma tabela products para encontrar todos os pares de produtos que pertencem à mesma categoria, o que é útil para mecanismos de recomendação ou verificações de similaridade.

CREATE TABLE products (
  id       INT PRIMARY KEY,
  name     VARCHAR(50),
  category VARCHAR(30)
);

INSERT INTO products VALUES
  (1, 'Laptop',  'Electronics'),
  (2, 'Phone',   'Electronics'),
  (3, 'Tablet',  'Electronics'),
  (4, 'Shirt',   'Clothing'),
  (5, 'Jeans',   'Clothing');

SELECT
  a.name AS product_1,
  b.name AS product_2,
  a.category
FROM products a
JOIN products b
  ON a.category = b.category
 AND a.id < b.id;

Armadilhas: produtos cartesianos e duplicatas

Dois erros comuns nas junções da tabela consigo mesma são os produtos cartesianos (esquecer completamente a condição da junção) e os pares duplicados (usar a.id <> b.id em vez de a.id < b.id).

Verifique sempre se a condição da junção está correta e use < em vez de <> quando precisar apenas de pares não ordenados, e não de pares ordenados.

-- Wrong: returns every ordered pair (A,B) AND (B,A)
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.manager_id = b.manager_id
                AND a.id <> b.id;

-- Correct: returns each unordered pair once
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.manager_id = b.manager_id
                AND a.id < b.id;

Verificação rápida

Verifique sua compreensão sobre junções autorreferentes e a comparação de linhas na mesma tabela.

Recapitulação da lição

Nesta lição, aprendeu a usar junções autorreferentes para comparar linhas dentro da mesma tabela.

Principais conclusões:

  • Atribua dois nomes alternativos à tabela (por exemplo, e e m) para que o banco de dados as trate como fontes separadas.
  • Use INNER JOIN quando precisar apenas de linhas que tenham correspondência e LEFT JOIN quando também quiser incluir linhas sem correspondência.
  • Use a.id < b.id para evitar pares não ordenados duplicados.
  • As junções autorreferentes funcionam para hierarquias (gerente/funcionário), buscas por similaridade (mesma categoria) e qualquer comparação em que duas linhas da mesma tabela precisem ser relacionadas.
  • As CTEs podem tornar consultas complexas com junções autorreferentes muito mais fáceis de ler e manter.

Perguntas Frequentes

A aula “Comparando linhas na mesma tabela” é grátis?

Sim — o texto completo de “Comparando linhas na mesma tabela” é 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 “Comparando linhas na mesma tabela”?

Encontre pares e relacionamentos. 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 3 de 4.

Quanto tempo leva a aula “Comparando linhas na mesma tabela”?

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

  1. O que é uma autojunção
  2. Funcionários e gerentes
  3. Comparando linhas na mesma tabela
  4. Limitações das autojunções
← Voltar para SQL Academy