Self Joins ou auto-junção são junções de uma tabela com ela mesma.
Visão geral
SELF JOIN vai funcionar exatamente como um INNER JOIN, porém, como o próprio nome diz, a junção é feita na mesma tabela, conforme ilustra a Figura 1.

Considere o seguinte cenário: temos a tabela alunos da Tabela 1 e desejamos listar os alunos que são da mesma turma que outro aluno na mesma tabela.
| id | nome | turma |
| 1 | Cintia Pereira | 1 |
| 2 | Lucas Gabriel | 2 |
| 3 | Felipe Bruno | 1 |
| 4 | Thiago Barcelos | 3 |
| 5 | Bruno Reis | 1 |
| 6 | Osvaldo Sobrinho | 4 |
| 7 | Fabiano Francisco | 4 |
SELECT
A1.nome,
A2.nome
FROM
aluno A1
INNER JOIN
aluno A2
ON (A1.id <> A2.id)
WHERE A1.turma = A2.turma
ORDER BY A1.nomeNo trecho de código acima fizemos um INNER JOIN na mesma tabela onde o id é diferente do outro id. Em seguida definimos as condições da consulta pelo WHERE, onde somente virão resultados que tenham a turma igual, conforme mostra a Tabela 2.
| nome | nome |
| Bruno Reis | Cintia Pereira |
| Bruno Reis | Felipe Bruno |
| Cintia Pereira | Felipe Bruno |
| Cintia Pereira | Bruno Reis |
| Fabiano Francisco | Osvaldo Sobrinho |
| Felipe Bruno | Cintia Pereira |
| Felipe Bruno | Bruno Reis |
| Osvaldo Sobrinho | Fabiano Francisco |
Observe que o aluno Thiago Barcelos (Tabela 1) não veio na consulta, pois não existe nenhum outro aluno na mesma turma que ele (turma de id 3).
Sintaxe
SELECT
[ tabela1.coluna1, tabela2.coluna1, ... | N.coluna1, N.coluna2, … ]
FROM
[ tabela1 A, tabela1 B ]
WHERE
[ A.coluna1 = B.coluna1 ]Na prática
Exemplo 1
Agora suponha que desejamos trazer todos os funcionários da tabela funcionario da Tabela 3 que tenha o mesmo salário que outro funcionário.
| id | nome | Salario |
| 1 | Nicolas Silva | 3500 |
| 2 | Pedro Henrique | 2500 |
| 3 | Manuel Soares | 3500 |
| 4 | Lucas Bené | 1350 |
Para esta consulta, temos o seguinte trecho de código abaixo:
SELECT
F1.nome,
F2.nome,
F1.salario
FROM
funcionario F1
INNER JOIN
funcionario F2
ON F1.id <> F2.id
WHERE F1.salario = F2.salarioObserve que fizemos um INNER JOIN na mesma tabela (SELF JOIN) e pedimos todos os funcionários que tenham o mesmo salário. Temos como resultado a Tabela 4.
| id | nome | nome | salario |
| 1 | Manuel Soares | Nicolas Silva | 3500 |
| 2 | Nicolas Silva | Manuel Soares | 3500 |
Exemplo 2
Para este exemplo, considere a tabela funcionario (Tabela 5), responsável por manter as informações sobre os funcionários da empresa.
| id | Nome | id_supervisor |
| 1 | Pedro Henrique | 6 |
| 2 | Lucas da Silva | 6 |
| 3 | Luana Gabriela | 7 |
| 4 | Renato Lazuna | 6 |
| 5 | Rafaela Barrosa | 7 |
| 6 | Arline da Costa | |
| 7 | Giseli Pascoa | |
| 8 | Renan Pereira | 6 |
Suponhamos que seja necessário trazer em uma consulta, o nome dos funcionários e também o nome do seu respectivo supervisor. Para isso podemos utilizar a query abaixo:
SELECT
F1.Nome as SUPERVISOR,
F2.nome as FUNCIONARIO
FROM
funcionario F1
INNER JOIN
funcionario F2
ON F1.id = F2.id_supervisor
Order by
F1.idO resultado da query acima pode ser visto abaixo, na (Tabela 6).
| SUPERVISOR | FUNCIONARIO |
| Arline da Costa | Pedro Henrique |
| Arline da Costa | Renan Pereira |
| Arline da Costa | Renato Lazuna |
| Arline da Costa | Lucas da Silva |
| Giseli Pascoa | Luana Gabriela |
| Giseli Pascoa | Rafaela Barrosa |