Não é estritamente necessário para a consulta, é verdade. Existe por vários motivos:
- Como uma restrição na tabela para impedir que você insira algo que não aponte para nada;
- Como uma pista para o otimizador; e
- Por razões históricas, onde era mais necessário.
(1) é provavelmente o mais importante dos três. Isso é chamado de integridade referencial . Isso significa que, se houver um valor em uma chave estrangeira, haverá um registro correspondente com esse valor como chave primária na tabela pai.
Dito isto, nem todos os bancos de dados suportam integridade referencial (por exemplo, tabelas MySQL/MyISAM) e aqueles que suportam não necessariamente a impõem (por razões de desempenho).