Most joins connect two different tables, but two specialised joins break that mould. A self join joins a table to itself, which is how you relate rows within the same table, such as players and their captains who are also players. A cross join deliberately pairs every row of one table with every row of another, producing all possible combinations on purpose rather than by mistake.
These joins are less common but indispensable for specific problems. Self joins handle hierarchies and within-table comparisons that no other tool expresses cleanly, while cross joins generate complete combination sets for scheduling, grids, and templating. Knowing them rounds out your join toolkit and, importantly, helps you recognise when an accidental cross join is the real cause of a runaway result you did not intend.
Both joins reuse the same join machinery you already know, but applied in unusual ways. A self join is just a normal join where both sides happen to be the same table, requiring aliases to tell the two copies apart. A cross join is a join with no matching condition at all. Understanding them deepens your grasp of what joining fundamentally does.