A self join means joining a table to itself using two different names called aliases. We compare rows inside the same table by joining on a condition. For example, to find employees and their managers in one employees table, we join employees as e1 to employees as e2 where e1.manager_id equals e2.id. We check each row of e1 against all rows of e2. If the join condition is true, we output a combined row. If the join condition involves NULL, it never matches, so no output row is produced. Aliases are necessary to distinguish the two copies of the same table. This pattern helps find relationships inside one table, like hierarchies or pairs.