A maneira mais fácil de entender um join SQL é como um pareamento de linhas. Para cada linha na tabela da esquerda, o banco de dados busca na tabela da direita linhas que satisfaçam a condição ON; cada correspondência gera uma linha de saída contendo colunas de ambas as tabelas de origem.
Para tornar isso concreto, utilize duas tabelas pequenas — students(id, name) e enrollments(student_id, course) — e combine-as usando uma verificação de igualdade: students.id = enrollments.student_id. Observe como os pares de linhas são formados com base nessa condição.
Ao encarar um join como um processo de pareamento, a contagem de linhas deixa de ser um mistério. Cada linha da tabela à esquerda contribui com um número de linhas de saída equivalente à quantidade de linhas correspondentes na tabela à direita — podendo ser zero, uma ou várias —, e o tamanho total do join é a soma dessas contribuições.
Antes de analisar qualquer código SQL, formule uma pergunta específica sobre essas mesmas tabelas. Se um aluno possui 2 linhas de matrícula correspondentes, outro possui 1 e um terceiro possui 0, qual deve ser o número total de linhas geradas pelo join? Explore as contagens de correspondências por aluno e como elas se somam.